diff --git a/gradle/settings.gradle b/gradle/settings.gradle index 6a0b008d70a54913f1f98457bd2bab9e719a1fcb..300d8959f3325c8f592e1b05bc817a54ede19fbb 100644 --- a/gradle/settings.gradle +++ b/gradle/settings.gradle @@ -1,5 +1,5 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'rtd_yeastx', - 'openbis_standard_technologies', 'installation', 'image_readers', 'ui-test', 'js-test', 'datamover', - 'plasmid', 'rtd_cina', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template', - 'openbis_statistics_server', 'openbis_benchmark' \ No newline at end of file + 'datastore_server', 'screening', 'deep_sequencing_unit', 'rtd_yeastx', + 'openbis_standard_technologies', 'installation', 'image_readers', 'ui-test', 'js-test', 'datamover', + 'rtd_cina', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template', + 'openbis_statistics_server', 'openbis_benchmark' \ No newline at end of file diff --git a/installation/settings.gradle b/installation/settings.gradle index 12be7850681587b97ba9f8c03725af0ea2db159a..9ab451cb9d2b3b5a8707519492a593353a2b8941 100644 --- a/installation/settings.gradle +++ b/installation/settings.gradle @@ -1,4 +1,4 @@ -includeFlat 'commonbase', 'common', - 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'plasmid', - 'openbis_standard_technologies', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' +includeFlat 'commonbase', 'common', + 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', + 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', + 'openbis_standard_technologies', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' diff --git a/js-test/settings.gradle b/js-test/settings.gradle index d6c54fa1f7181bca897f37a58740b5a3de3b6124..cd65fb91b8436fc378f3a3322d24bad7568dad1e 100644 --- a/js-test/settings.gradle +++ b/js-test/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'plasmid', 'openbis_standard_technologies', + 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'openbis_standard_technologies', 'ui-test','screening' diff --git a/openbis_standard_technologies/build.gradle b/openbis_standard_technologies/build.gradle index cd7e954c06006fbe4265fb8cf476159faa778ec1..9e23780db5c75491607abec23d73d7381e2e43e4 100644 --- a/openbis_standard_technologies/build.gradle +++ b/openbis_standard_technologies/build.gradle @@ -39,7 +39,6 @@ evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') evaluationDependsOn(':rtd_yeastx') evaluationDependsOn(':deep_sequencing_unit') -evaluationDependsOn(':plasmid') evaluationDependsOn(':big_data_link_server') evaluationDependsOn(':openbis_ng_ui') @@ -84,7 +83,6 @@ dependencies { datastore_server project(':deep_sequencing_unit'), project(':rtd_yeastx'), project(':screening'), - project(':plasmid'), 'bioformats:bioformats:6.5.1', 'imagej:ij:1.43u', 'cisd:cisd-openbis-knime-server:13.6.0.r29301', diff --git a/openbis_standard_technologies/settings.gradle b/openbis_standard_technologies/settings.gradle index 9fd3b7e8b5f85dcb197bbe1d42fd2835dffdb449..6db664969a29fd6824d3c95b9f9cbad32af3a575 100644 --- a/openbis_standard_technologies/settings.gradle +++ b/openbis_standard_technologies/settings.gradle @@ -1,3 +1,3 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'plasmid', 'big_data_link_server', - 'openbis_ng_ui', 'microservice_server_template' +includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', + 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'big_data_link_server', + 'openbis_ng_ui', 'microservice_server_template' diff --git a/plasmid/.gitignore b/plasmid/.gitignore deleted file mode 100644 index 44068dcafbe222e53f75bbfc61d39d298754bcc5..0000000000000000000000000000000000000000 --- a/plasmid/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/targets -/bin -/build/ -/.idea/ -*.iml -*.eml \ No newline at end of file diff --git a/plasmid/build.gradle b/plasmid/build.gradle deleted file mode 100644 index f44d5fc9b25a0b74d2f9cf7b91bcf698101435f7..0000000000000000000000000000000000000000 --- a/plasmid/build.gradle +++ /dev/null @@ -1,68 +0,0 @@ -evaluationDependsOn(':commonbase') -evaluationDependsOn(':common') -evaluationDependsOn(':openbis_api') -evaluationDependsOn(':openbis-common') -evaluationDependsOn(':authentication') -evaluationDependsOn(':dbmigration') -evaluationDependsOn(':openbis') -evaluationDependsOn(':datastore_server') - -apply from: '../gradle/javaproject.gradle' - -archivesBaseName = 'datastore_server_plugin-plasmid' - -dependencies { - api project(':datastore_server'), - 'openbis:openbis-mobile:r29271' - - testImplementation project(path: ':commonbase', configuration: 'tests'), - project(path: ':common', configuration: 'tests'), - project(path: ':dbmigration', configuration: 'tests'), - project(path: ':authentication', configuration: 'tests'), - project(path: ':openbis_api', configuration: 'tests'), - project(path: ':openbis-common', configuration: 'tests'), - project(path: ':datastore_server', configuration: 'tests'), - 'fjelmer:classycle:1.4.2', - 'testng:testng:6.8-CISD' - testImplementation (project(path: ':openbis', configuration: 'tests')) { - exclude group: 'google', module: 'gwt-user' - } -} - -sourceSets { - main { - resources { - srcDirs = ['source/java'] - } - } - test { - resources { - srcDirs = ['source/java'] - } - } -} - -jar { - duplicatesStrategy 'include' - manifest { - attributes("Main-Class": "ch.systemsx.cisd.plasmid.BuildAndEnvironmentInfo", - "Version": versionNumber, - "Build-Number": "${versionNumber} (r${revisionNumber},${cleanFlag})") - } - - from('targets/dist') { - include 'BUILD-*' - } -} - -task plasmidZip(type: Zip) { - baseName 'datastore_server_plugin-plasmid' - from (jar.archivePath) { - into 'datastore_server/lib' - } - from('source/core-plugins') { - into 'core-plugins' - } - rename 'datastore_server_plugin-plasmid(.*)\\.jar', 'datastore_server_plugin-plasmid.jar' -} -build.dependsOn plasmidZip diff --git a/plasmid/dist/etc/log.xml b/plasmid/dist/etc/log.xml deleted file mode 100644 index f9104bc9f0a7755d3daa16d106cc174a8537b9a6..0000000000000000000000000000000000000000 --- a/plasmid/dist/etc/log.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="DEFAULT" class="org.apache.log4j.DailyRollingFileAppender"> - - <param name="File" value="log/datastore_server_log.txt"/> - <param name="DatePattern" value="'.'yyyy-MM-dd"/> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - </appender> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender"> - - <param name="BufferSize" value="512" /> - <param name="SMTPHost" value="localhost" /> - <param name="From" value="datastore_server@localhost" /> - <param name="To" value="root@localhost" /> - <param name="Subject" value="ATTENTION: etl server" /> - <param name="EvaluatorClass" value="ch.systemsx.cisd.common.logging.AlwaysTrueTriggeringEventEvaluator" /> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - <!--filter class="org.apache.log4j.varia.LevelRangeFilter"> - <param name="LevelMin" value="ERROR"/> - <param name="LevelMax" value="FATAL"/> - </filter--> - - </appender> - - <category name="NOTIFY"> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - <appender-ref ref="EMAIL" /> - </category> - - <root> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - </root> - -</log4j:configuration> diff --git a/plasmid/dist/etc/service.properties b/plasmid/dist/etc/service.properties deleted file mode 100644 index 546561e4bec6f8c7bb1b4e5bec9ac695c013000d..0000000000000000000000000000000000000000 --- a/plasmid/dist/etc/service.properties +++ /dev/null @@ -1,118 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -# The root directory of the data store -storeroot-dir = data/store - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8444 - -# Session timeout in minutes -session-timeout = 720 - -# Path to the keystore -keystore.path = etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 60 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 180 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = https://localhost:8443/ - -# The username to use when contacting the openBIS server -username = etlserver_csb - -# The password to use when contacting the openBIS server -password = etlserver_csb - -# The base URL for Web client access. -download-url = https://localhost:8444 - -# SMTP properties (must start with 'mail' to be considered). -# mail.smtp.host = localhost -# mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = main-thread - -# --------------------------------------------------------------------------- -# main thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -main-thread.incoming-dir = data/incoming - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -main-thread.incoming-data-completeness-condition = auto-detection -# ---------------- Plugin properties -# The extractor class to use for code extraction -main-thread.data-set-info-extractor = ch.systemsx.cisd.etlserver.DataSetInfoExtractorWithFileNameProperty -main-thread.data-set-info-extractor.extractor = ch.ethz.bsse.cisd.plasmid.dss.ParentDirectoryDataSetInfoExtractor -main-thread.data-set-info-extractor.extractor.extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -main-thread.data-set-info-extractor.extractor.extractor.space-code = YEAST_LAB - -# The extractor class to use for type extraction -main-thread.type-extractor = ch.ethz.bsse.cisd.plasmid.dss.PlasmidTypeExtractor -main-thread.type-extractor.dataset-types = SEQ_FILE: gb fasta xdna, RAW_DATA: ab1 -main-thread.type-extractor.file-types = GB: gb, FASTA: fasta, XDNA: xdna, AB1: ab1 -main-thread.type-extractor.default-file-type = PROPRIETARY -main-thread.type-extractor.directory-file-type = DIRECTORY - -# The storage processor (IStorageProcessor implementation) -main-thread.storage-processor = ch.ethz.bsse.cisd.plasmid.dss.PlasmidStorageProcessor -main-thread.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -# path to the root directory of the server where PlasMapper is deployed (webapps in jetty) -main-thread.storage-processor.plasmapper-root-dir = /local0/openbis/sprint/openBIS-server/jetty/webapps -# the base URL of PlasMapper web application -main-thread.storage-processor.plasmapper-base-url = ${server-url}/PlasMapper - -# The dataset handler (IDataSetHandler implementation) -main-thread.dataset-handler = ch.ethz.bsse.cisd.plasmid.dss.PlasmidDataSetHandler -jython-version=2.7 diff --git a/plasmid/etc/log.xml b/plasmid/etc/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/plasmid/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/plasmid/etc/service.properties b/plasmid/etc/service.properties deleted file mode 100644 index 18544be97dcca96dab6758f34756b6c8ed123fe5..0000000000000000000000000000000000000000 --- a/plasmid/etc/service.properties +++ /dev/null @@ -1,138 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -data-folder = targets/playground/data - -# The root directory of the data store -storeroot-dir = ${data-folder}/store - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8889 - -# Session timeout in minutes -session-timeout = 720 - -# Set to 'false' for development/testing without deployed server. In this mode datastore will not use -# SSL when connecting to openbis. Otherwise all 'keystore' properties need to be set for SSL connection -# (default when use-ssl property is not set so there is no need to specify it on production servers). -use-ssl = false - -# Path to the keystore -keystore.path = ../datastore_server/dist/etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 5 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 2 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = http://localhost:8888 - -# The username to use when contacting the openBIS server -username = etlserver_csb - -# The password to use when contacting the openBIS server -password = etlserver_csb - -# The base URL for Web client access. -download-url = http://localhost:${port} - -# SMTP properties (must start with 'mail' to be considered). -mail.smtp.host = file://targets/playground/email -mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = main-thread,cifex - -# --------------------------------------------------------------------------- -# main thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -main-thread.incoming-dir = ${data-folder}/incoming - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -main-thread.incoming-data-completeness-condition = auto-detection -# ---------------- Plugin properties -# The extractor class to use for code extraction -main-thread.data-set-info-extractor = ch.systemsx.cisd.etlserver.DataSetInfoExtractorWithFileNameProperty -main-thread.data-set-info-extractor.extractor = ch.ethz.bsse.cisd.plasmid.dss.ParentDirectoryDataSetInfoExtractor -main-thread.data-set-info-extractor.extractor.extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -main-thread.data-set-info-extractor.extractor.extractor.space-code = YEAST_LAB - -# The extractor class to use for type extraction -main-thread.type-extractor = ch.ethz.bsse.cisd.plasmid.dss.PlasmidTypeExtractor -main-thread.type-extractor.dataset-types = SEQ_FILE: gb fasta xdna fa, RAW_DATA: ab1 -main-thread.type-extractor.file-types = GB: gb, FASTA: fasta, XDNA: xdna, FA: fa, AB1: ab1 -main-thread.type-extractor.default-file-type = PROPRIETARY -main-thread.type-extractor.directory-file-type = DIRECTORY - -# The storage processor (IStorageProcessor implementation) -main-thread.storage-processor = ch.ethz.bsse.cisd.plasmid.dss.PlasmidStorageProcessor -main-thread.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -# path to the root directory of the server where PlasMapper is deployed (webapps in jetty) -main-thread.storage-processor.plasmapper-root-dir = /Users/buczekp/CISD/cifex/jetty/webapps -# the base URL of PlasMapper web application -main-thread.storage-processor.plasmapper-base-url = http://localhost:8082/PlasMapper - -# The dataset handler (IDataSetHandler implementation) -main-thread.dataset-handler = ch.ethz.bsse.cisd.plasmid.dss.PlasmidDataSetHandler - -# --------------------------------------------------------------------------- -# 'cifex' thread configuration -# --------------------------------------------------------------------------- -cifex.incoming-dir = ${data-folder}/incoming-cifex -cifex.incoming-data-completeness-condition = auto-detection -cifex.delete-unidentified = true -cifex.data-set-info-extractor = ch.systemsx.cisd.etlserver.DataSetInfoExtractorWithFileNameProperty -cifex.data-set-info-extractor.strip-extension = true -cifex.data-set-info-extractor.extractor = ch.systemsx.cisd.etlserver.cifex.CifexDataSetInfoExtractor -cifex.type-extractor = ch.systemsx.cisd.etlserver.cifex.CifexTypeExtractor -cifex.storage-processor = ch.systemsx.cisd.etlserver.CifexStorageProcessor -cifex.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -cifex.storage-processor.keep-file-regex = .*(?<!request\.properties)$ -jython-version=2.7 diff --git a/plasmid/gradle/wrapper/gradle-wrapper.jar b/plasmid/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..0000000000000000000000000000000000000000 Binary files a/plasmid/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/plasmid/gradle/wrapper/gradle-wrapper.properties b/plasmid/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7745c4ec463c7bb1c4ff6a5e58db239890345152..0000000000000000000000000000000000000000 --- a/plasmid/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://sissource.ethz.ch/openbis/openbis-public/openbis-ivy/-/raw/main/gradle/distribution/7.4/gradle-7.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/plasmid/gradlew b/plasmid/gradlew deleted file mode 100755 index 83f2acfdc319a24e8766cca78f32474ad7a22dd6..0000000000000000000000000000000000000000 --- a/plasmid/gradlew +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/plasmid/gradlew.bat b/plasmid/gradlew.bat deleted file mode 100644 index 24467a141f791695fc1009c78d913b2c849d1412..0000000000000000000000000000000000000000 --- a/plasmid/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/plasmid/resource/PlasMapper/PlasMapper_dist.zip b/plasmid/resource/PlasMapper/PlasMapper_dist.zip deleted file mode 100644 index a0424c07679a4532cfa4ce35cf78dcae895a953a..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/PlasMapper/PlasMapper_dist.zip and /dev/null differ diff --git a/plasmid/resource/PlasMapper/PlasMapper_download.tar.gz b/plasmid/resource/PlasMapper/PlasMapper_download.tar.gz deleted file mode 100644 index bbb0bd29f02bfc067b0d5322fcf21efc90240cd5..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/PlasMapper/PlasMapper_download.tar.gz and /dev/null differ diff --git a/plasmid/resource/PlasMapper/README.txt b/plasmid/resource/PlasMapper/README.txt deleted file mode 100644 index b37957447ae50cf9c3306e0937d33fc743c43107..0000000000000000000000000000000000000000 --- a/plasmid/resource/PlasMapper/README.txt +++ /dev/null @@ -1,47 +0,0 @@ -This directory contains: - -- jetty.zip - version 7.1.4 of jetty with configuration that allows easy deployment of Plasmapper (port 8082) -- PlasMapper_download.tar.gz - version 2.0 of PlasMapper downloaded from http://wishart.biology.ualberta.ca/PlasMapper. -- PlasMapper_dist.zip - compressed distribution directory created in step 5 of the following instruction -- YeastLab-common_enzymes.txt - list of common enzymes used in Yeast Lab -- YeastLab-PlasMapper_dist.zip (TODO) - distribution with common enzymes changed to the ones used in Yeast Lab -- example.gb - exmple GB file that can be used for testing after installation is complete - - -*Installation instructions for version 2.0* - -1. Unpack PlasMapper_download.tar.gz into your workspace. -2. In order to use the project in eclipse perform the following steps: -- Create a new project in eclipse using PlasMapper as source directory -- Fix build path: --- remove /tmp/tomcat/common/lib/servlet-api.jar --- add /libraries/jetty/servlet-api-2.5.jar -- [optional] change settings (can be done later, when deploying the application) --- properties file: ca.ualberta.xdong.plasMapper.annotate.plasMapConfiguration_en_CA.properties --- change '/home/tomcat/webapps/PlasMapper' to the path where PlasMapper will be deployed --- 'plasMapRoot' leads to an external directory, where PlasMapper will create tmp directory - for its output -3. in build.xml change values of properties: -- <property name="installdir" value="dist"/> -- <property name="servletjar" value="../libraries/jetty/servlet-api-2.5.jar"/> -4. [optional] change list of common enzymes in - ca.ualberta.xdong.plasMapper.annotate.PlasmidCleavageSiteAnnotate.java - (for Yeast Lab see YeasLab-common_enzymes.txt) -5. run ant install -6. copy dist/webapps/PlasMapper to webapps of the application server -(make sure plasMapConfiguration_en_CA.properties are properly configured) - -Additionally there needs to be blastall installed on the machine running PlasMapper. Latest -version can be downloaded from ftp://ftp.ncbi.nih.gov/blast/executables/release/LATEST. - -Go to http://<server root>:8080/PlasMapper/ after deployment to check that everything is working. -You should be able to generate a PNG for 'example.gb' file from this directory: -- select the GB file -- change the Image Size from 850x750 to 1200x1000 -- click on Graphic Map button (below DNA sequence text area) \ No newline at end of file diff --git a/plasmid/resource/PlasMapper/YeastLab-common_enzymes.txt b/plasmid/resource/PlasMapper/YeastLab-common_enzymes.txt deleted file mode 100644 index ba41df9df598f2f4fbe41a8ecab7c0a53a132652..0000000000000000000000000000000000000000 --- a/plasmid/resource/PlasMapper/YeastLab-common_enzymes.txt +++ /dev/null @@ -1,40 +0,0 @@ -String[] commonEnzymeName = - { - "AarI", - "AatII", - "AgeI", - "AscI", - "AvrII", - "BamHI", - "BglII", - "ClaI", - "EagI", - "EcoRI", - "EcoRV", - "FseI", - "HindIII", - "KpnI", - "MluI", - "NaeI", - "NcoI", - "NdeI", - "NgoMIV", - "NheI", - "NotI", - "PacI", - "PmeI", - "PstI", - "PvuI", - "PvuII", - "SacI", - "SacII", - "SapI", - "SbfI", - "ScaI", - "SpeI", - "SphI", - "StuI", - "SwaI", - "XbaI", - "XhoI" - }; \ No newline at end of file diff --git a/plasmid/resource/PlasMapper/example.gb b/plasmid/resource/PlasMapper/example.gb deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/PlasMapper/example.gb +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/PlasMapper/jetty.zip b/plasmid/resource/PlasMapper/jetty.zip deleted file mode 100644 index a156bd8e5832ff058b06b1c22b28ff435da5e251..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/PlasMapper/jetty.zip and /dev/null differ diff --git a/plasmid/resource/README b/plasmid/resource/README deleted file mode 100644 index 6409f9bc58d2ded44fcf610e7af34680f2275257..0000000000000000000000000000000000000000 --- a/plasmid/resource/README +++ /dev/null @@ -1,44 +0,0 @@ -h1. How to test on productive server (temporary) - -1. Go to https://openbis-csb.ethz.ch/openbis (all CISD developers have INSTANCE_ADMIN role assigned) -- there is a test experiment EXPERIMENT_TEST and a test sample SAMPLE_TEST with a few datasets. -- to keep the instance clean one should only: --- create/delete samples attached to EXPERIMENT_TEST (don't delete sample SAMPLE_TEST) --- register/delete datasets attached to test samples -2. Login to bs-plasmids.ethz.ch as openbis -3. There is a link 'dss-data' to a shared directory with a dropbox ('incoming') and an example -of a directory with files that can be registered as datasets for sample SAMPLE_TEST. -- to register datasets for the SAMPLE_TEST sample copy ~/dss-data/SAMPLE_TEST to ~/dss-data/incoming - -h1. Quick Setup for development mode - -1. openbis -1.1 in service.properties set: database.kind = plasmids -1.2 create a clean db using the script plasmid/resource/recreate_db.sh (change OWNER) - -2. PlasMapper -2.1. unzip plasmid/resource/PlasMapper/jetty.zip -2.2. unzip plasmid/resource/PlasMapper/PlasMapper_dist.zip and move PlasMapper to webapps -2.3. Install blastall. Latest version can be downloaded from ftp://ftp.ncbi.nih.gov/blast/executables/release/LATEST. -2.3. change all paths leading to PlasMapper webapp dir and blastall in -PlasMapper/WEB-INF/classes/ca/ualberta/xdong/plasMapper/annotate/plasMapConfiguration_en_CA.properties - -3. plasmids -3.1 in targets create directories: -- targets/playground/data/incoming -- targets/playground/data/incoming-cifex -- targets/playground/data/store -3.2 change values of properties in /etc/service.properties needed for PlasMapper integration -main-thread.storage-processor.plasmapper-root-dir -main-thread.storage-processor.plasmapper-base-url - -h1. Run and prepare data - -1. run openbis -2. import samples using plasmid/resource/example/sample-import.tsv (multiple sample type) -3. run plasmid DSS using launch configuration from plasmid/resource/eclipse -4. run the external jetty with PlasMapper deployed - -To test dataset registration and integration with PlasMapper copy an example directory -plasmid/resource/example/FRP_1 to targets/playground/data/incoming. Datasets -will be attached to sample with code 'BOX_1:FRP_1'. \ No newline at end of file diff --git a/plasmid/resource/db/plasmids-YeastLab.sql b/plasmid/resource/db/plasmids-YeastLab.sql deleted file mode 100644 index 31de31ad1573da8d3aa4f0fe22233daf92161c7e..0000000000000000000000000000000000000000 --- a/plasmid/resource/db/plasmids-YeastLab.sql +++ /dev/null @@ -1,4686 +0,0 @@ --- --- PostgreSQL database dump --- - -SET statement_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = off; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET escape_string_warning = off; - --- --- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: - --- - -CREATE PROCEDURAL LANGUAGE plpgsql; - - -SET search_path = public, pg_catalog; - --- --- Name: archiving_status; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN archiving_status AS character varying(100) - CONSTRAINT archiving_status_check CHECK (((VALUE)::text = ANY (ARRAY[('LOCKED'::character varying)::text, ('AVAILABLE'::character varying)::text, ('ARCHIVED'::character varying)::text, ('ARCHIVE_PENDING'::character varying)::text, ('UNARCHIVE_PENDING'::character varying)::text]))); - - --- --- Name: authorization_role; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN authorization_role AS character varying(40) - CONSTRAINT authorization_role_check CHECK (((VALUE)::text = ANY (ARRAY[('ADMIN'::character varying)::text, ('POWER_USER'::character varying)::text, ('USER'::character varying)::text, ('OBSERVER'::character varying)::text, ('ETL_SERVER'::character varying)::text]))); - - --- --- Name: boolean_char; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN boolean_char AS boolean DEFAULT false; - - --- --- Name: boolean_char_or_unknown; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN boolean_char_or_unknown AS character(1) DEFAULT 'U'::bpchar - CONSTRAINT boolean_char_or_unknown_check CHECK ((VALUE = ANY (ARRAY['F'::bpchar, 'T'::bpchar, 'U'::bpchar]))); - - --- --- Name: code; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN code AS character varying(60); - - --- --- Name: column_label; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN column_label AS character varying(128); - - --- --- Name: data_store_service_kind; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN data_store_service_kind AS character varying(40) - CONSTRAINT data_store_service_kind_check CHECK (((VALUE)::text = ANY (ARRAY[('PROCESSING'::character varying)::text, ('QUERIES'::character varying)::text]))); - - --- --- Name: description_2000; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN description_2000 AS character varying(2000); - - --- --- Name: event_type; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN event_type AS character varying(40) - CONSTRAINT event_type_check CHECK (((VALUE)::text = ANY (ARRAY[('DELETION'::character varying)::text, ('INVALIDATION'::character varying)::text, ('MOVEMENT'::character varying)::text]))); - - --- --- Name: file; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN file AS bytea; - - --- --- Name: file_name; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN file_name AS character varying(100); - - --- --- Name: generic_value; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN generic_value AS character varying(1024); - - --- --- Name: grid_expression; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN grid_expression AS character varying(2000); - - --- --- Name: grid_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN grid_id AS character varying(200); - - --- --- Name: object_name; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN object_name AS character varying(50); - - --- --- Name: ordinal_int; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN ordinal_int AS bigint - CONSTRAINT ordinal_int_check CHECK ((VALUE > 0)); - - --- --- Name: query_type; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN query_type AS character varying(40) - CONSTRAINT query_type_check CHECK (((VALUE)::text = ANY (ARRAY[('GENERIC'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('SAMPLE'::character varying)::text, ('DATA_SET'::character varying)::text, ('MATERIAL'::character varying)::text]))); - - --- --- Name: real_value; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN real_value AS real; - - --- --- Name: tech_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN tech_id AS bigint; - - --- --- Name: time_stamp; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN time_stamp AS timestamp with time zone; - - --- --- Name: time_stamp_dfl; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN time_stamp_dfl AS timestamp with time zone NOT NULL DEFAULT now(); - - --- --- Name: title_100; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN title_100 AS character varying(100); - - --- --- Name: user_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN user_id AS character varying(50); - - --- --- Name: check_dataset_relationships_on_data_table_modification(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION check_dataset_relationships_on_data_table_modification() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; -BEGIN - -- if there is a connection with a Sample there should not be any connection with a parent Data Set - IF (NEW.samp_id IS NOT NULL) THEN - -- count number of parents - SELECT count(*) INTO counter - FROM data_set_relationships - WHERE data_id_child = NEW.id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected with a Sample and a parent Data Set at the same time.', NEW.code; - END IF; - END IF; - RETURN NEW; -END; -$$; - - --- --- Name: check_dataset_relationships_on_relationships_table_modification(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION check_dataset_relationships_on_relationships_table_modification() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; - sample_id TECH_ID; - data_code CODE; -BEGIN - -- child will have a parent added so it should not be connected with any sample - SELECT samp_id, code INTO sample_id, data_code - FROM data - WHERE id = NEW.data_id_child; - IF (sample_id IS NOT NULL) THEN - RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected to a Sample and to a parent Data Set at the same time.', data_code; - END IF; - RETURN NEW; -END; -$$; - - --- --- Name: controlled_vocabulary_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION controlled_vocabulary_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_code CODE; -BEGIN - - select code into v_code from data_types where id = NEW.daty_id; - - -- Check if the data is of type "CONTROLLEDVOCABULARY" - if v_code = 'CONTROLLEDVOCABULARY' then - if NEW.covo_id IS NULL then - RAISE EXCEPTION 'Insert/Update of Property Type (Code: %) failed, as its Data Type is CONTROLLEDVOCABULARY, but it is not linked to a Controlled Vocabulary.', NEW.code; - end if; - end if; - - RETURN NEW; - -END; -$$; - - --- --- Name: data_set_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION data_set_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from data_set_type_property_types dstpt, property_types pt - where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: experiment_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION experiment_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from experiment_type_property_types etpt, property_types pt - where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: external_data_storage_format_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION external_data_storage_format_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_covo_code CODE; - data_code CODE; -BEGIN - - select code into v_covo_code from controlled_vocabularies - where is_internal_namespace = true and - id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt); - -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT" - if v_covo_code != 'STORAGE_FORMAT' then - select code into data_code from data where id = NEW.data_id; - RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', data_code, v_covo_code; - end if; - - RETURN NEW; - -END; -$$; - - --- --- Name: material_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION material_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from material_type_property_types etpt, property_types pt - where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: rename_sequence(character varying, character varying); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION rename_sequence(old_name character varying, new_name character varying) RETURNS integer - LANGUAGE plpgsql - AS $$ -DECLARE - CURR_SEQ_VAL INTEGER; -BEGIN - SELECT INTO CURR_SEQ_VAL NEXTVAL(OLD_NAME); - EXECUTE 'CREATE SEQUENCE ' || NEW_NAME || ' START WITH ' || CURR_SEQ_VAL; - EXECUTE 'DROP SEQUENCE ' || OLD_NAME; - RETURN CURR_SEQ_VAL; -END; -$$; - - --- --- Name: sample_code_uniqueness_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION sample_code_uniqueness_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; -BEGIN - LOCK TABLE samples IN EXCLUSIVE MODE; - - IF (NEW.samp_id_part_of is NULL) THEN - IF (NEW.dbin_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code; - END IF; - ELSIF (NEW.grou_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code already exists.', NEW.code; - END IF; - END IF; - ELSE - IF (NEW.dbin_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same container already exists.', NEW.code; - END IF; - ELSIF (NEW.grou_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code and being the part of the same container already exists.', NEW.code; - END IF; - END IF; - END IF; - - RETURN NEW; -END; -$$; - - --- --- Name: sample_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION sample_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from sample_type_property_types etpt, property_types pt - where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: sample_subcode_uniqueness_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION sample_subcode_uniqueness_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; - unique_subcode BOOLEAN_CHAR; -BEGIN - LOCK TABLE samples IN EXCLUSIVE MODE; - - SELECT is_subcode_unique into unique_subcode FROM sample_types WHERE id = NEW.saty_id; - - IF (unique_subcode) THEN - IF (NEW.dbin_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and dbin_id = NEW.dbin_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample of the same type with the same subcode already exists.', NEW.code; - END IF; - ELSIF (NEW.grou_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and grou_id = NEW.grou_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample of the same type with the same subcode already exists.', NEW.code; - END IF; - END IF; - END IF; - - RETURN NEW; -END; -$$; - - --- --- Name: attachment_content_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE attachment_content_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: attachment_content_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('attachment_content_id_seq', 1, true); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: attachment_contents; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE attachment_contents ( - id tech_id NOT NULL, - value file NOT NULL -); - - --- --- Name: attachment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE attachment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: attachment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('attachment_id_seq', 1, true); - - --- --- Name: attachments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE attachments ( - id tech_id NOT NULL, - expe_id tech_id, - samp_id tech_id, - proj_id tech_id, - exac_id tech_id NOT NULL, - file_name file_name NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - version integer NOT NULL, - pers_id_registerer tech_id NOT NULL, - title title_100, - description description_2000, - CONSTRAINT atta_arc_ck CHECK ((((((expe_id IS NOT NULL) AND (proj_id IS NULL)) AND (samp_id IS NULL)) OR (((expe_id IS NULL) AND (proj_id IS NOT NULL)) AND (samp_id IS NULL))) OR (((expe_id IS NULL) AND (proj_id IS NULL)) AND (samp_id IS NOT NULL)))) -); - - --- --- Name: authorization_group_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE authorization_group_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: authorization_group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('authorization_group_id_seq', 2, false); - - --- --- Name: authorization_group_persons; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE authorization_group_persons ( - ag_id tech_id NOT NULL, - pers_id tech_id NOT NULL -); - - --- --- Name: authorization_groups; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE authorization_groups ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: code_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE code_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: code_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('code_seq', 100, true); - - --- --- Name: controlled_vocabularies; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE controlled_vocabularies ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - is_internal_namespace boolean_char DEFAULT false NOT NULL, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_chosen_from_list boolean_char DEFAULT true NOT NULL, - source_uri character varying(250) -); - - --- --- Name: controlled_vocabulary_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE controlled_vocabulary_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: controlled_vocabulary_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('controlled_vocabulary_id_seq', 7, true); - - --- --- Name: controlled_vocabulary_terms; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE controlled_vocabulary_terms ( - id tech_id NOT NULL, - code object_name NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - covo_id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - label column_label, - description description_2000, - ordinal ordinal_int NOT NULL, - CONSTRAINT cvte_ck CHECK (((ordinal)::bigint > 0)) -); - - --- --- Name: cvte_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE cvte_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: cvte_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('cvte_id_seq', 61, true); - - --- --- Name: data; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data ( - id tech_id NOT NULL, - code code, - dsty_id tech_id NOT NULL, - dast_id tech_id NOT NULL, - expe_id tech_id NOT NULL, - data_producer_code code, - production_timestamp time_stamp, - samp_id tech_id, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - is_placeholder boolean_char DEFAULT false, - is_valid boolean_char DEFAULT true, - modification_timestamp time_stamp DEFAULT now(), - is_derived boolean_char NOT NULL -); - - --- --- Name: data_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_id_seq', 1, true); - - --- --- Name: data_set_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_properties ( - id tech_id NOT NULL, - ds_id tech_id NOT NULL, - dstpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT dspr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: data_set_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_property_id_seq', 9, true); - - --- --- Name: data_set_relationship_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_relationship_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_relationship_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_relationship_id_seq', 1, false); - - --- --- Name: data_set_relationships; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_relationships ( - data_id_parent tech_id NOT NULL, - data_id_child tech_id NOT NULL -); - - --- --- Name: data_set_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_type_id_seq', 4, true); - - --- --- Name: data_set_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_type_property_types ( - id tech_id NOT NULL, - dsty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: data_set_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - main_ds_pattern character varying(300), - main_ds_path character varying(1000) -); - - --- --- Name: data_store_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_store_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_store_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_store_id_seq', 1, true); - - --- --- Name: data_store_service_data_set_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_store_service_data_set_types ( - data_store_service_id tech_id NOT NULL, - data_set_type_id tech_id NOT NULL -); - - --- --- Name: data_store_services; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_store_services ( - id tech_id NOT NULL, - key character varying(256) NOT NULL, - label character varying(256) NOT NULL, - kind data_store_service_kind NOT NULL, - data_store_id tech_id NOT NULL -); - - --- --- Name: data_store_services_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_store_services_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_store_services_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_store_services_id_seq', 12, true); - - --- --- Name: data_stores; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_stores ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code code NOT NULL, - download_url character varying(1024) NOT NULL, - remote_url character varying(250) NOT NULL, - session_token character varying(50) NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_archiver_configured boolean_char DEFAULT false NOT NULL -); - - --- --- Name: data_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_type_id_seq', 9, true); - - --- --- Name: data_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 NOT NULL -); - - --- --- Name: database_instance_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE database_instance_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: database_instance_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('database_instance_id_seq', 1, true); - - --- --- Name: database_instances; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE database_instances ( - id tech_id NOT NULL, - code code NOT NULL, - uuid code NOT NULL, - is_original_source boolean_char DEFAULT false NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL -); - - --- --- Name: database_version_logs; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE database_version_logs ( - db_version character varying(4) NOT NULL, - module_name character varying(250), - run_status character varying(10), - run_status_timestamp timestamp without time zone, - module_code bytea, - run_exception bytea -); - - --- --- Name: dstpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE dstpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: dstpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('dstpt_id_seq', 3, true); - - --- --- Name: etpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE etpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: etpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('etpt_id_seq', 1, false); - - --- --- Name: event_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE event_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: event_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('event_id_seq', 1, true); - - --- --- Name: events; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE events ( - id tech_id NOT NULL, - event_type event_type NOT NULL, - description description_2000, - reason description_2000, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - entity_type character varying(80) NOT NULL, - identifier character varying(250) NOT NULL, - CONSTRAINT evnt_et_enum_ck CHECK (((entity_type)::text = ANY (ARRAY[('ATTACHMENT'::character varying)::text, ('DATASET'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('GROUP'::character varying)::text, ('MATERIAL'::character varying)::text, ('PROJECT'::character varying)::text, ('PROPERTY_TYPE'::character varying)::text, ('SAMPLE'::character varying)::text, ('VOCABULARY'::character varying)::text, ('AUTHORIZATION_GROUP'::character varying)::text]))) -); - - --- --- Name: experiment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_id_seq', 1, true); - - --- --- Name: experiment_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_properties ( - id tech_id NOT NULL, - expe_id tech_id NOT NULL, - etpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT expr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: experiment_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_property_id_seq', 1, false); - - --- --- Name: experiment_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_type_id_seq', 1, true); - - --- --- Name: experiment_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_type_property_types ( - id tech_id NOT NULL, - exty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: experiment_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: experiments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiments ( - id tech_id NOT NULL, - perm_id code NOT NULL, - code code NOT NULL, - exty_id tech_id NOT NULL, - mate_id_study_object tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - proj_id tech_id NOT NULL, - inva_id tech_id, - is_public boolean_char DEFAULT false NOT NULL -); - - --- --- Name: external_data; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE external_data ( - data_id tech_id NOT NULL, - location character varying(1024) NOT NULL, - ffty_id tech_id NOT NULL, - loty_id tech_id NOT NULL, - cvte_id_stor_fmt tech_id NOT NULL, - is_complete boolean_char_or_unknown DEFAULT 'U'::bpchar NOT NULL, - cvte_id_store tech_id, - status archiving_status DEFAULT 'AVAILABLE'::character varying NOT NULL -); - - --- --- Name: file_format_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE file_format_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: file_format_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('file_format_type_id_seq', 7, true); - - --- --- Name: file_format_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE file_format_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL -); - - --- --- Name: filter_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE filter_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: filter_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('filter_id_seq', 1, true); - - --- --- Name: filters; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE filters ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - name character varying(200) NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression character varying(2000) NOT NULL, - is_public boolean NOT NULL, - grid_id character varying(200) NOT NULL -); - - --- --- Name: grid_custom_columns; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE grid_custom_columns ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code character varying(200) NOT NULL, - label column_label NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression grid_expression NOT NULL, - is_public boolean NOT NULL, - grid_id grid_id NOT NULL -); - - --- --- Name: grid_custom_columns_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE grid_custom_columns_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: grid_custom_columns_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('grid_custom_columns_id_seq', 1, false); - - --- --- Name: group_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE group_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('group_id_seq', 1, true); - - --- --- Name: groups; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE groups ( - id tech_id NOT NULL, - code code NOT NULL, - dbin_id tech_id NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL -); - - --- --- Name: invalidation_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE invalidation_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: invalidation_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('invalidation_id_seq', 1, false); - - --- --- Name: invalidations; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE invalidations ( - id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - reason description_2000 -); - - --- --- Name: locator_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE locator_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: locator_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('locator_type_id_seq', 1, true); - - --- --- Name: locator_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE locator_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 -); - - --- --- Name: material_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_id_seq', 1, false); - - --- --- Name: material_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_properties ( - id tech_id NOT NULL, - mate_id tech_id NOT NULL, - mtpt_id tech_id NOT NULL, - value generic_value, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - pers_id_registerer tech_id NOT NULL, - cvte_id tech_id, - mate_prop_id tech_id, - CONSTRAINT mapr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: material_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_property_id_seq', 1, false); - - --- --- Name: material_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_type_id_seq', 2, true); - - --- --- Name: material_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_type_property_types ( - id tech_id NOT NULL, - maty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: material_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: materials; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE materials ( - id tech_id NOT NULL, - code code NOT NULL, - maty_id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - dbin_id tech_id NOT NULL -); - - --- --- Name: mtpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE mtpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: mtpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('mtpt_id_seq', 1, false); - - --- --- Name: perm_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE perm_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: perm_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('perm_id_seq', 100, true); - - --- --- Name: person_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE person_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: person_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('person_id_seq', 14, true); - - --- --- Name: persons; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE persons ( - id tech_id NOT NULL, - first_name character varying(30), - last_name character varying(30), - user_id user_id NOT NULL, - email object_name, - dbin_id tech_id NOT NULL, - grou_id tech_id, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id, - display_settings file -); - - --- --- Name: project_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE project_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: project_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('project_id_seq', 1, true); - - --- --- Name: projects; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE projects ( - id tech_id NOT NULL, - code code NOT NULL, - grou_id tech_id NOT NULL, - pers_id_leader tech_id, - description description_2000, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: property_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE property_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: property_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('property_type_id_seq', 18, true); - - --- --- Name: property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE property_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 NOT NULL, - label column_label NOT NULL, - daty_id tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - covo_id tech_id, - is_managed_internally boolean_char DEFAULT false NOT NULL, - is_internal_namespace boolean_char DEFAULT false NOT NULL, - dbin_id tech_id NOT NULL, - maty_prop_id tech_id -); - - --- --- Name: queries; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE queries ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - name character varying(200) NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression character varying(2000) NOT NULL, - is_public boolean NOT NULL, - query_type query_type NOT NULL, - db_key code DEFAULT '1'::character varying NOT NULL -); - - --- --- Name: query_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE query_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: query_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('query_id_seq', 1, false); - - --- --- Name: role_assignment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE role_assignment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: role_assignment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('role_assignment_id_seq', 9, true); - - --- --- Name: role_assignments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE role_assignments ( - id tech_id NOT NULL, - role_code authorization_role NOT NULL, - grou_id tech_id, - dbin_id tech_id, - pers_id_grantee tech_id, - ag_id_grantee tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - CONSTRAINT roas_ag_pers_arc_ck CHECK ((((ag_id_grantee IS NOT NULL) AND (pers_id_grantee IS NULL)) OR ((ag_id_grantee IS NULL) AND (pers_id_grantee IS NOT NULL)))), - CONSTRAINT roas_dbin_grou_arc_ck CHECK ((((dbin_id IS NOT NULL) AND (grou_id IS NULL)) OR ((dbin_id IS NULL) AND (grou_id IS NOT NULL)))) -); - - --- --- Name: sample_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_id_seq', 1, true); - - --- --- Name: sample_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_properties ( - id tech_id NOT NULL, - samp_id tech_id NOT NULL, - stpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT sapr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: sample_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_property_id_seq', 1, true); - - --- --- Name: sample_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_type_id_seq', 2, true); - - --- --- Name: sample_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_type_property_types ( - id tech_id NOT NULL, - saty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - is_displayed boolean_char DEFAULT true NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: sample_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - is_listable boolean_char DEFAULT true NOT NULL, - generated_from_depth integer DEFAULT 0 NOT NULL, - part_of_depth integer DEFAULT 0 NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_auto_generated_code boolean_char DEFAULT false NOT NULL, - generated_code_prefix code DEFAULT 'S'::character varying NOT NULL, - is_subcode_unique boolean_char DEFAULT false NOT NULL -); - - --- --- Name: samples; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE samples ( - id tech_id NOT NULL, - perm_id code NOT NULL, - code code NOT NULL, - expe_id tech_id, - samp_id_top tech_id, - samp_id_generated_from tech_id, - saty_id tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - pers_id_registerer tech_id NOT NULL, - inva_id tech_id, - samp_id_control_layout tech_id, - dbin_id tech_id, - grou_id tech_id, - samp_id_part_of tech_id, - CONSTRAINT samp_dbin_grou_arc_ck CHECK ((((dbin_id IS NOT NULL) AND (grou_id IS NULL)) OR ((dbin_id IS NULL) AND (grou_id IS NOT NULL)))) -); - - --- --- Name: stpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE stpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: stpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('stpt_id_seq', 18, true); - - --- --- Data for Name: attachment_contents; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY attachment_contents (id, value) FROM stdin; -\. - - --- --- Data for Name: attachments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY attachments (id, expe_id, samp_id, proj_id, exac_id, file_name, registration_timestamp, version, pers_id_registerer, title, description) FROM stdin; -\. - - --- --- Data for Name: authorization_group_persons; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY authorization_group_persons (ag_id, pers_id) FROM stdin; -1 8 -1 9 -1 7 -1 5 -2 4 -2 6 -2 10 -2 11 -2 12 -2 13 -\. - - --- --- Data for Name: authorization_groups; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY authorization_groups (id, dbin_id, code, description, registration_timestamp, pers_id_registerer, modification_timestamp) FROM stdin; -1 1 YEAST_LAB_USERS \N 2010-05-31 13:56:09.374057+02 1 2010-05-31 21:13:25.907+02 -2 1 CISD_ADMINS \N 2010-05-31 21:13:52.3511+02 1 2010-06-01 10:00:46.224+02 -\. - - --- --- Data for Name: controlled_vocabularies; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY controlled_vocabularies (id, code, description, registration_timestamp, pers_id_registerer, is_managed_internally, is_internal_namespace, dbin_id, modification_timestamp, is_chosen_from_list, source_uri) FROM stdin; -1 STORAGE_FORMAT The on-disk storage format of a data set 2010-05-26 13:38:36.62686+02 1 t t 1 2010-05-26 13:38:36.62686+02 t \N -2 OWNER \N 2010-05-26 17:29:55.9819+02 1 f f 1 2010-05-26 17:29:56.019+02 t \N -5 BACTERIAL_ANTIBIOTIC_RESISTANCE Bacterial Antibiotic Resistance 2010-05-26 17:37:11.497201+02 1 f f 1 2010-05-26 17:37:11.497+02 t \N -4 YEAST_MARKER Yeast Marker 2010-05-26 17:35:36.30475+02 1 f f 1 2010-05-26 17:35:36.305+02 t \N -3 BACKBONE \N 2010-05-26 17:32:30.058024+02 1 f f 1 2010-05-26 17:32:30.058+02 t \N -6 BOX_SIZE \N 2010-05-26 21:54:23.206312+02 1 f f 1 2010-05-27 17:48:35.162+02 t \N -7 STORAGE_POSITION_ROW Row in the Box 2010-05-27 17:58:08.636202+02 1 f f 1 2010-05-27 17:58:08.651+02 t \N -\. - - --- --- Data for Name: controlled_vocabulary_terms; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY controlled_vocabulary_terms (id, code, registration_timestamp, covo_id, pers_id_registerer, label, description, ordinal) FROM stdin; -1 PROPRIETARY 2010-05-26 13:38:36.62686+02 1 1 \N \N 1 -2 BDS_DIRECTORY 2010-05-26 13:38:36.62686+02 1 1 \N \N 2 -3 FABIAN_RUDOLF 2010-05-26 17:29:55.9819+02 2 1 Fabian Rudolf \N 1 -4 KRISTINA_ELFSTROM 2010-05-26 17:29:55.9819+02 2 1 Kristina Elfström \N 2 -5 DIANA_OTTOZ 2010-05-26 17:29:55.9819+02 2 1 Diana Ottoz \N 3 -6 BEATA_MIERZWA 2010-05-26 17:29:55.9819+02 2 1 Beata Mierzwa \N 4 -8 MAREIKE_BONGERS 2010-05-26 17:29:55.9819+02 2 1 Mareike Bongers \N 6 -9 MARIO_MARICHISIO 2010-05-26 17:29:55.9819+02 2 1 Mario Marchisio \N 7 -11 PBSN 2010-05-26 17:32:30.058024+02 3 1 pBSN \N 2 -12 PSPPOLY_A 2010-05-26 17:32:30.058024+02 3 1 pSPpoly(A) \N 3 -13 PF6A 2010-05-26 17:32:30.058024+02 3 1 pF6a \N 4 -14 PKERG10Y 2010-05-26 17:32:30.058024+02 3 1 pKERG10y \N 5 -15 PKERG11Y 2010-05-26 17:32:30.058024+02 3 1 pKERG11y \N 6 -16 PKERG12Y 2010-05-26 17:32:30.058024+02 3 1 pKERG12y \N 7 -17 PKERG20Y 2010-05-26 17:32:30.058024+02 3 1 pKERG20y \N 8 -18 PKERG21Y 2010-05-26 17:32:30.058024+02 3 1 pKERG21y \N 9 -19 PKERG22Y 2010-05-26 17:32:30.058024+02 3 1 pKERG22y \N 10 -20 PRS30Y 2010-05-26 17:32:30.058024+02 3 1 pRS30y \N 11 -21 PRS31Y 2010-05-26 17:32:30.058024+02 3 1 pRS31y \N 12 -22 PRS40Y 2010-05-26 17:32:30.058024+02 3 1 pRS40y \N 13 -23 PRS41Y 2010-05-26 17:32:30.058024+02 3 1 pRS41y \N 14 -24 PRS42Y 2010-05-26 17:32:30.058024+02 3 1 pRS42y \N 15 -25 PET22B 2010-05-26 17:32:30.058024+02 3 1 pET22b \N 16 -26 UNKNOWN 2010-05-26 17:32:30.058024+02 3 1 (unknown) \N 17 -27 URA3 2010-05-26 17:35:36.30475+02 4 1 URA3 \N 1 -28 HIS3 2010-05-26 17:35:36.30475+02 4 1 HIS3 \N 2 -29 LEU2 2010-05-26 17:35:36.30475+02 4 1 LEU2 \N 3 -30 TRP1 2010-05-26 17:35:36.30475+02 4 1 TRP1 \N 4 -31 MET15 2010-05-26 17:35:36.30475+02 4 1 MET15 \N 5 -32 LYS2 2010-05-26 17:35:36.30475+02 4 1 LYS2 \N 6 -33 ADE1 2010-05-26 17:35:36.30475+02 4 1 ADE1 \N 7 -34 KANMX 2010-05-26 17:35:36.30475+02 4 1 KanMX \N 8 -35 NATMX 2010-05-26 17:35:36.30475+02 4 1 NatMX \N 9 -36 HYGMX 2010-05-26 17:35:36.30475+02 4 1 HygMX \N 10 -37 URA3MX 2010-05-26 17:35:36.30475+02 4 1 Ura3MX \N 11 -38 HIS3MX 2010-05-26 17:35:36.30475+02 4 1 His3MX \N 12 -39 BLA 2010-05-26 17:37:11.497201+02 5 1 \N \N 1 -40 KAN 2010-05-26 17:37:11.497201+02 5 1 \N \N 2 -41 CAM 2010-05-26 17:37:11.497201+02 5 1 \N \N 3 -7 ROBERT_GNUGGE 2010-05-26 17:29:55.9819+02 2 1 Robert Gnuegge \N 5 -44 96_WELL 2010-05-27 17:48:24.846982+02 6 1 96 Well (8x12) \N 2 -45 384_WELL 2010-05-27 17:48:35.150109+02 6 1 384 Well (16x24) \N 3 -46 A 2010-05-27 17:58:08.636202+02 7 1 \N \N 1 -47 B 2010-05-27 17:58:08.636202+02 7 1 \N \N 2 -48 C 2010-05-27 17:58:08.636202+02 7 1 \N \N 3 -49 D 2010-05-27 17:58:08.636202+02 7 1 \N \N 4 -50 E 2010-05-27 17:58:08.636202+02 7 1 \N \N 5 -51 F 2010-05-27 17:58:08.636202+02 7 1 \N \N 6 -52 G 2010-05-27 17:58:08.636202+02 7 1 \N \N 7 -53 H 2010-05-27 17:58:08.636202+02 7 1 \N \N 8 -54 I 2010-05-27 17:58:08.636202+02 7 1 \N \N 9 -55 J 2010-05-27 17:58:08.636202+02 7 1 \N \N 10 -56 K 2010-05-27 17:58:08.636202+02 7 1 \N \N 11 -57 L 2010-05-27 17:58:08.636202+02 7 1 \N \N 12 -58 M 2010-05-27 17:58:08.636202+02 7 1 \N \N 13 -59 N 2010-05-27 17:58:08.636202+02 7 1 \N \N 14 -60 O 2010-05-27 17:58:08.636202+02 7 1 \N \N 15 -61 P 2010-05-27 17:58:08.636202+02 7 1 \N \N 16 -10 PBLUESCRIPT_II_KS_PLUS 2010-05-26 17:32:30.058024+02 3 1 pBluescript II KS + \N 1 -42 81_BOX 2010-05-26 21:54:23.206312+02 6 1 81 Box (9x9) \N 1 -\. - - --- --- Data for Name: data; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data (id, code, dsty_id, dast_id, expe_id, data_producer_code, production_timestamp, samp_id, registration_timestamp, is_placeholder, is_valid, modification_timestamp, is_derived) FROM stdin; -\. - - --- --- Data for Name: data_set_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_properties (id, ds_id, dstpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: data_set_relationships; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_relationships (data_id_parent, data_id_child) FROM stdin; -\. - - --- --- Data for Name: data_set_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_type_property_types (id, dsty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, ordinal, section) FROM stdin; -1 1 17 t f 1 2010-05-30 12:56:12.273594+02 1 \N -2 2 17 t f 1 2010-05-30 12:56:22.039873+02 1 \N -3 3 17 t f 1 2010-05-30 12:56:29.902648+02 1 \N -4 4 17 t f 1 2010-05-30 12:56:29.902648+02 1 \N -\. - - --- --- Data for Name: data_set_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_types (id, code, description, dbin_id, modification_timestamp, main_ds_pattern, main_ds_path) FROM stdin; -1 UNKNOWN \N 1 2010-05-26 17:41:21.272491+02 \N \N -2 SEQ_FILE \N 1 2010-05-26 17:41:21.272491+02 generated\*.svg \N -3 RAW_DATA \N 1 2010-05-26 17:41:58.696032+02 \N \N -4 VERIFICATION \N 1 2010-05-26 17:42:07.328466+02 *.* \N -\. - - --- --- Data for Name: data_store_service_data_set_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_store_service_data_set_types (data_store_service_id, data_set_type_id) FROM stdin; -\. - - --- --- Data for Name: data_store_services; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_store_services (id, key, label, kind, data_store_id) FROM stdin; -\. - - --- --- Data for Name: data_stores; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_stores (id, dbin_id, code, download_url, remote_url, session_token, registration_timestamp, modification_timestamp, is_archiver_configured) FROM stdin; -1 1 DSS1 http://localhost:8889 http://127.0.0.1:8889 100602084423180-FD91B3AB8DF8337EC55D3A7443C03192 2010-05-26 13:38:36.62686+02 2010-06-02 08:44:23.384+02 f -\. - - --- --- Data for Name: data_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_types (id, code, description) FROM stdin; -1 VARCHAR Short text -2 MULTILINE_VARCHAR Long text -3 INTEGER Integer number -4 REAL Real number, i.e. an inexact, variable-precision numeric type -5 BOOLEAN True or False -6 TIMESTAMP Both date and time. Format: yyyy-mm-dd hh:mm:ss -7 CONTROLLEDVOCABULARY Controlled Vocabulary -8 MATERIAL Reference to a material -9 HYPERLINK Address of a web page -\. - - --- --- Data for Name: database_instances; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY database_instances (id, code, uuid, is_original_source, registration_timestamp) FROM stdin; -1 CSB 7ABDB8A8-969C-4E83-BC56-487752B8E6B7 t 2010-05-26 13:38:36.62686+02 -\. - - --- --- Data for Name: database_version_logs; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY database_version_logs (db_version, module_name, run_status, run_status_timestamp, module_code, run_exception) FROM stdin; -053 ./source//sql/postgresql/migration/migration-052-053.sql SUCCESS 2010-06-07 08:14:25.176 -- Migration from 052 to 053\\012\\012-- Change code uniqueness check for samples of specific type.\\012-- If sample_types.is_unique_code flag is set to 'true', codes of samples of the type will need to\\012-- be unique no matter if they are contained in a container or not. Otherwise standard uniqueness \\012-- check is performed (taking container connection into consideration).\\012\\012ALTER TABLE sample_types ADD COLUMN is_unique_code boolean_char NOT NULL DEFAULT false;\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012 unique_type_code BOOLEAN_CHAR;\\012BEGIN\\012 LOCK TABLE samples IN EXCLUSIVE MODE;\\012 \\012 SELECT is_unique_code into unique_type_code FROM sample_types WHERE id = NEW.saty_id;\\012 \\012 IF (unique_type_code) THEN\\012 IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample of the same type with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample of the same type with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 ELSE \\011\\012\\011 IF (NEW.samp_id_part_of is NULL) THEN\\012\\011\\011 IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011 SELECT count(*) into counter FROM samples \\012\\011\\011 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id;\\012 IF (counter > 0) THEN\\012\\011\\011\\011\\011 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012 END IF;\\012\\011\\011 ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011 SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id;\\012\\011\\011\\011 IF (counter > 0) THEN\\012\\011\\011\\011\\011 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code already exists.', NEW.code;\\012\\011\\011\\011 END IF;\\012 END IF;\\012 ELSE\\012\\011\\011 IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011 SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012\\011\\011\\011 IF (counter > 0) THEN\\012\\011\\011\\011\\011 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same container already exists.', NEW.code;\\012\\011\\011\\011 END IF;\\012\\011\\011 ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011 SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012\\011\\011\\011 IF (counter > 0) THEN\\012\\011\\011\\011\\011 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code and being the part of the same container already exists.', NEW.code;\\012\\011\\011\\011 END IF;\\012\\011\\011 END IF;\\012 END IF; \\012 END IF;\\012 \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012 \N -\. - - --- --- Data for Name: events; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY events (id, event_type, description, reason, pers_id_registerer, registration_timestamp, entity_type, identifier) FROM stdin; -\. - - --- --- Data for Name: experiment_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_properties (id, expe_id, etpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: experiment_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_type_property_types (id, exty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, ordinal, section) FROM stdin; -\. - - --- --- Data for Name: experiment_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_types (id, code, description, dbin_id, modification_timestamp) FROM stdin; -1 PLASMID \N 1 2010-05-26 13:41:56.662019+02 -\. - - --- --- Data for Name: experiments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiments (id, perm_id, code, exty_id, mate_id_study_object, pers_id_registerer, registration_timestamp, modification_timestamp, proj_id, inva_id, is_public) FROM stdin; -1 20100526134230750-1 EXP_1 1 \N 1 2010-05-26 13:42:30.711108+02 2010-05-31 13:46:27.159+02 1 \N f -\. - - --- --- Data for Name: external_data; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY external_data (data_id, location, ffty_id, loty_id, cvte_id_stor_fmt, is_complete, cvte_id_store, status) FROM stdin; -\. - - --- --- Data for Name: file_format_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY file_format_types (id, code, description, dbin_id) FROM stdin; -1 PROPRIETARY Proprietary File Format 1 -2 DIRECTORY 1 -3 GB 1 -4 FASTA 1 -5 XDNA 1 -6 AB1 1 -7 FA 1 -\. - - --- --- Data for Name: filters; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY filters (id, dbin_id, name, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, grid_id) FROM stdin; -\. - - --- --- Data for Name: grid_custom_columns; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY grid_custom_columns (id, dbin_id, code, label, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, grid_id) FROM stdin; -\. - - --- --- Data for Name: groups; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY groups (id, code, dbin_id, description, registration_timestamp, pers_id_registerer) FROM stdin; -1 YEAST_LAB 1 \N 2010-05-26 13:40:16.222552+02 1 -\. - - --- --- Data for Name: invalidations; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY invalidations (id, pers_id_registerer, registration_timestamp, reason) FROM stdin; -\. - - --- --- Data for Name: locator_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY locator_types (id, code, description) FROM stdin; -1 RELATIVE_LOCATION Relative Location -\. - - --- --- Data for Name: material_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_properties (id, mate_id, mtpt_id, value, registration_timestamp, modification_timestamp, pers_id_registerer, cvte_id, mate_prop_id) FROM stdin; -\. - - --- --- Data for Name: material_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_type_property_types (id, maty_id, prty_id, is_mandatory, is_managed_internally, registration_timestamp, pers_id_registerer, ordinal, section) FROM stdin; -\. - - --- --- Data for Name: material_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_types (id, code, description, dbin_id, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: materials; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY materials (id, code, maty_id, pers_id_registerer, registration_timestamp, modification_timestamp, dbin_id) FROM stdin; -\. - - --- --- Data for Name: persons; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY persons (id, first_name, last_name, user_id, email, dbin_id, grou_id, registration_timestamp, pers_id_registerer, display_settings) FROM stdin; -6 Tomasz Ryszard Pylak tpylak tomasz.pylak@bsse.ethz.ch 1 1 2010-05-28 14:15:04.232136+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -7 Robert Gnügge rgnuegge robert.gnuegge@bsse.ethz.ch 1 1 2010-05-31 15:49:28.331889+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -8 Kristina Elfström elfstrok kristina.elfstroem@bsse.ethz.ch 1 1 2010-05-31 15:50:01.381873+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -9 Diana Silvia Marina Ottoz ottozd diana.ottoz@bsse.ethz.ch 1 1 2010-05-31 17:04:02.897602+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -14 ETL server etlserver_csb piotr.buczek@bsse.ethz.ch 1 1 2010-06-01 13:59:41.111995+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -5 Fabian Rudolf rudolff fabian.rudolf@bsse.ethz.ch 1 1 2010-05-27 17:13:31.758869+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -10 Izabela Maria Adamczyk izabelaa izabela.adamczyk@bsse.ethz.ch 1 1 2010-06-01 09:53:00.914766+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -11 Bernd Rinn brinn bernd.rinn@bsse.ethz.ch 1 1 2010-06-01 09:59:37.172417+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -12 Franz-Josef Elmer felmer franz-josef.elmer@bsse.ethz.ch 1 1 2010-06-01 10:00:46.008847+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -13 Chandrasekhar Ramakrishnan cramakri cramakri@inf.ethz.ch 1 1 2010-06-01 10:00:46.008847+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -4 Piotr Buczek buczekp piotr.buczek@bsse.ethz.ch 1 1 2010-05-27 15:54:23.647329+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -1 System User system 1 1 2010-05-26 13:38:36.62686+02 \N \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\030w\\010\\000\\000\\000 \\000\\000\\000\\015t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\036w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\206q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000ht\\000\\007SUBCODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\351t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000it\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\000\\000\\000\\000\\000Wt\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000Pt\\000\\007PROJECTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\001\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\001\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\001\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\001\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\001\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\001\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\001\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\001\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\001\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\247t\\000\\020containerParent1sq\\000~\\000\\012\\000\\000\\000\\000\\000\\332t\\000\\024generatedFromParent1xt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\026w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\267q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\001\\000\\000\\000\\000\\347q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000it\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\001\\000\\000\\000\\000\\216t\\000\\027property-USER-FILE_NAMExt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\240sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\246sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\257sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\261sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\273sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\000\\000\\000\\000\\332q\\000~\\000\\217sq\\000~\\000\\012\\001\\000\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\000\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\000\\000\\000\\000)q\\000~\\000\\207sq\\000~\\000\\012\\000\\000\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\000\\000\\000\\000|q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000\\200q\\000~\\000ssq\\000~\\000\\012\\000\\000\\000\\000\\000mq\\000~\\000usq\\000~\\000\\012\\000\\000\\000\\000\\000\\357q\\000~\\000wsq\\000~\\000\\012\\001\\000\\000\\000\\000\\200q\\000~\\000{sq\\000~\\000\\012\\000\\000\\000\\000\\000\\177q\\000~\\000\\177sq\\000~\\000\\012\\000\\000\\000\\000\\000aq\\000~\\000\\201sq\\000~\\000\\012\\000\\000\\000\\000\\000\\301q\\000~\\000\\203sq\\000~\\000\\012\\000\\000\\000\\000\\000\\303q\\000~\\000ysq\\000~\\000\\012\\000\\000\\000\\000\\0018q\\000~\\000\\205xt\\000,sample-details-grid-SAMPLE-(all)-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000\\215sq\\000~\\000\\012\\000\\001\\000\\000\\0000q\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000@q\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000Eq\\000~\\000\\217sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205xt\\000&entity-browser-grid-SAMPLE-PLASMID_BOXsq\\000~\\000\\010\\000\\000\\000\\020w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\247q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\000\\000\\000\\000xq\\000~\\000\\213xt\\000\\027attachment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\007w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\011FILE_NAMEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010PERMLINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007VERSIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\005TITLEsq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\004t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\001t\\0003attachment-sectiongeneric-sample-viewer-PLASMID_BOXsq\\000~\\001E\\000t\\000+sample-sectiongeneric-sample-viewer-PLASMIDq\\000~\\001Ht\\0001data-set-sectiongeneric-sample-viewer-PLASMID_BOXq\\000~\\001Hx -\. - - --- --- Data for Name: projects; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY projects (id, code, grou_id, pers_id_leader, description, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -1 PLASMIDS 1 \N \N 1 2010-05-26 13:40:44.011979+02 2010-05-26 13:42:30.763+02 -\. - - --- --- Data for Name: property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY property_types (id, code, description, label, daty_id, registration_timestamp, pers_id_registerer, covo_id, is_managed_internally, is_internal_namespace, dbin_id, maty_prop_id) FROM stdin; -2 OWNER Owner Owner 7 2010-05-26 17:43:09.455462+02 1 2 f f 1 \N -3 OWNER_NUMBER Owner Number Owner Number 1 2010-05-26 17:44:12.71825+02 1 \N f f 1 \N -4 PLASMID_NAME Plasmid Name Plasmid Name 1 2010-05-26 17:44:49.704455+02 1 \N f f 1 \N -5 BACKBONE Backbone Backbone 7 2010-05-26 17:45:12.139095+02 1 3 f f 1 \N -6 BACTERIAL_ANTIBIOTIC_RESISTANCE Bacterial Antibiotic Resistance Bacterial Antibiotic Resistance 7 2010-05-26 17:46:13.565449+02 1 5 f f 1 \N -7 YEAST_MARKER (Yeast) Marker (Yeast) Marker 7 2010-05-26 17:46:45.413022+02 1 4 f f 1 \N -8 OTHER_MARKER Other Marker Other Marker 1 2010-05-26 17:47:27.064274+02 1 \N f f 1 \N -9 FLANKING_RESTRICTION_ENZYMES Flanking Restriction Enzymes Flanking Restriction Enzymes 1 2010-05-26 17:47:52.936812+02 1 \N f f 1 \N -10 COMMENTS Comments Comments 2 2010-05-26 17:48:11.007632+02 1 \N f f 1 \N -15 BOX_SIZE Box Size Box Size 7 2010-05-26 21:54:56.547721+02 1 6 f f 1 \N -13 COLUMN Column number in the Box Column 3 2010-05-26 18:38:35.546129+02 1 \N f f 1 \N -16 ROW Row letter in the Box Row 7 2010-05-27 17:58:56.942478+02 1 7 f f 1 \N -14 DERIVATIVE_OF Codes (separated by commas) of those Plasmids that the current Plasmid is a combination of. One of the Plasmid is the Parent. Derivative Of 1 2010-05-26 21:45:36.120436+02 1 \N f f 1 \N -17 FILE_NAME Name of the original file stored in DSS Original File Name 1 2010-05-30 12:55:28.819182+02 1 \N f f 1 \N -\. - - --- --- Data for Name: queries; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY queries (id, dbin_id, name, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, query_type, db_key) FROM stdin; -\. - - --- --- Data for Name: role_assignments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY role_assignments (id, role_code, grou_id, dbin_id, pers_id_grantee, ag_id_grantee, pers_id_registerer, registration_timestamp) FROM stdin; -1 ADMIN \N 1 1 \N 1 2010-05-26 13:39:42.830149+02 -7 USER 1 \N \N 1 1 2010-05-31 13:56:25.85998+02 -6 ADMIN \N 1 5 \N 1 2010-05-27 21:11:29.554356+02 -8 ADMIN \N 1 \N 2 1 2010-05-31 21:14:11.261376+02 -9 ETL_SERVER \N 1 14 \N 1 2010-06-01 14:00:28.560623+02 -\. - - --- --- Data for Name: sample_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_properties (id, samp_id, stpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: sample_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_type_property_types (id, saty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, is_displayed, ordinal, section) FROM stdin; -1 1 16 t f 1 2010-05-27 17:59:42.28433+02 t 1 Storage Information -2 1 13 t f 1 2010-05-26 19:08:07.246686+02 t 2 Storage Information -3 1 2 t f 1 2010-05-26 19:13:10.256579+02 t 3 Plasmid Data -4 1 3 f f 1 2010-05-26 19:11:49.533054+02 t 4 Plasmid Data -5 1 4 t f 1 2010-05-26 19:14:56.30574+02 t 5 Plasmid Data -6 1 5 t f 1 2010-05-26 18:39:38.450567+02 t 6 Plasmid Data -7 1 14 f f 1 2010-05-26 21:46:21.937645+02 t 7 Plasmid Data -8 1 6 t f 1 2010-05-26 19:06:55.50256+02 t 8 Plasmid Data -9 1 7 f f 1 2010-05-26 19:15:29.812545+02 t 9 Plasmid Data -10 1 8 f f 1 2010-05-26 19:10:09.014083+02 t 10 Plasmid Data -11 1 9 f f 1 2010-05-26 19:10:01.329441+02 t 11 Plasmid Data -12 1 10 f f 1 2010-05-26 19:09:07.086779+02 t 12 Plasmid Data -20 2 15 t f 1 2010-05-26 21:55:14.652494+02 t 1 \N -\. - - --- --- Data for Name: sample_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_types (id, code, description, dbin_id, is_listable, generated_from_depth, part_of_depth, modification_timestamp, is_auto_generated_code, generated_code_prefix, is_subcode_unique) FROM stdin; -1 PLASMID \N 1 t 1 1 2010-05-26 13:43:50.663104+02 f FRP_ t -2 PLASMID_BOX \N 1 t 0 0 2010-05-26 21:51:13.659151+02 f BOX_ t -\. - - --- --- Data for Name: samples; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY samples (id, perm_id, code, expe_id, samp_id_top, samp_id_generated_from, saty_id, registration_timestamp, modification_timestamp, pers_id_registerer, inva_id, samp_id_control_layout, dbin_id, grou_id, samp_id_part_of) FROM stdin; -\. - - --- --- Name: ag_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: ag_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_pk PRIMARY KEY (id); - - --- --- Name: agp_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_pk PRIMARY KEY (pers_id, ag_id); - - --- --- Name: atta_expe_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_expe_bk_uk UNIQUE (expe_id, file_name, version); - - --- --- Name: atta_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_pk PRIMARY KEY (id); - - --- --- Name: atta_proj_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_proj_bk_uk UNIQUE (proj_id, file_name, version); - - --- --- Name: atta_samp_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_samp_bk_uk UNIQUE (samp_id, file_name, version); - - --- --- Name: covo_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_bk_uk UNIQUE (code, is_internal_namespace, dbin_id); - - --- --- Name: covo_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_pk PRIMARY KEY (id); - - --- --- Name: cvte_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_bk_uk UNIQUE (code, covo_id); - - --- --- Name: cvte_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_pk PRIMARY KEY (id); - - --- --- Name: dast_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: dast_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_pk PRIMARY KEY (id); - - --- --- Name: data_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_bk_uk UNIQUE (code); - - --- --- Name: data_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_pk PRIMARY KEY (id); - - --- --- Name: daty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_types - ADD CONSTRAINT daty_bk_uk UNIQUE (code); - - --- --- Name: daty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_types - ADD CONSTRAINT daty_pk PRIMARY KEY (id); - - --- --- Name: dbin_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_bk_uk UNIQUE (code); - - --- --- Name: dbin_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_pk PRIMARY KEY (id); - - --- --- Name: dbin_uuid_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_uuid_uk UNIQUE (uuid); - - --- --- Name: dspr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_bk_uk UNIQUE (ds_id, dstpt_id); - - --- --- Name: dspr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_pk PRIMARY KEY (id); - - --- --- Name: dsre_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_bk_uk UNIQUE (data_id_child, data_id_parent); - - --- --- Name: dssdst_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_bk_uk UNIQUE (data_store_service_id, data_set_type_id); - - --- --- Name: dsse_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_bk_uk UNIQUE (key, data_store_id); - - --- --- Name: dsse_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_pk PRIMARY KEY (id); - - --- --- Name: dstpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_bk_uk UNIQUE (dsty_id, prty_id); - - --- --- Name: dstpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_pk PRIMARY KEY (id); - - --- --- Name: dsty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: dsty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_pk PRIMARY KEY (id); - - --- --- Name: etpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_bk_uk UNIQUE (exty_id, prty_id); - - --- --- Name: etpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_pk PRIMARY KEY (id); - - --- --- Name: evnt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY events - ADD CONSTRAINT evnt_pk PRIMARY KEY (id); - - --- --- Name: exac_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachment_contents - ADD CONSTRAINT exac_pk PRIMARY KEY (id); - - --- --- Name: exda_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_bk_uk UNIQUE (location, loty_id); - - --- --- Name: exda_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_pk PRIMARY KEY (data_id); - - --- --- Name: expe_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_bk_uk UNIQUE (code, proj_id); - - --- --- Name: expe_pi_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pi_uk UNIQUE (perm_id); - - --- --- Name: expe_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pk PRIMARY KEY (id); - - --- --- Name: expr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_bk_uk UNIQUE (expe_id, etpt_id); - - --- --- Name: expr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_pk PRIMARY KEY (id); - - --- --- Name: exty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: exty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_pk PRIMARY KEY (id); - - --- --- Name: ffty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: ffty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_pk PRIMARY KEY (id); - - --- --- Name: filt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_bk_uk UNIQUE (name, dbin_id, grid_id); - - --- --- Name: filt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_pk PRIMARY KEY (id); - - --- --- Name: grid_custom_columns_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_bk_uk UNIQUE (code, dbin_id, grid_id); - - --- --- Name: grid_custom_columns_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_pk PRIMARY KEY (id); - - --- --- Name: grou_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: grou_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_pk PRIMARY KEY (id); - - --- --- Name: inva_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY invalidations - ADD CONSTRAINT inva_pk PRIMARY KEY (id); - - --- --- Name: loty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY locator_types - ADD CONSTRAINT loty_bk_uk UNIQUE (code); - - --- --- Name: loty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY locator_types - ADD CONSTRAINT loty_pk PRIMARY KEY (id); - - --- --- Name: mapr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_bk_uk UNIQUE (mate_id, mtpt_id); - - --- --- Name: mapr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_pk PRIMARY KEY (id); - - --- --- Name: mate_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_bk_uk UNIQUE (code, maty_id, dbin_id); - - --- --- Name: mate_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_pk PRIMARY KEY (id); - - --- --- Name: maty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: maty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_pk PRIMARY KEY (id); - - --- --- Name: mtpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_bk_uk UNIQUE (maty_id, prty_id); - - --- --- Name: mtpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_pk PRIMARY KEY (id); - - --- --- Name: pers_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_bk_uk UNIQUE (dbin_id, user_id); - - --- --- Name: pers_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_pk PRIMARY KEY (id); - - --- --- Name: proj_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_bk_uk UNIQUE (code, grou_id); - - --- --- Name: proj_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pk PRIMARY KEY (id); - - --- --- Name: prty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_bk_uk UNIQUE (code, is_internal_namespace, dbin_id); - - --- --- Name: prty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_pk PRIMARY KEY (id); - - --- --- Name: quer_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_bk_uk UNIQUE (name, dbin_id); - - --- --- Name: quer_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_pk PRIMARY KEY (id); - - --- --- Name: roas_ag_group_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_group_bk_uk UNIQUE (ag_id_grantee, role_code, grou_id); - - --- --- Name: roas_ag_instance_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_instance_bk_uk UNIQUE (ag_id_grantee, role_code, dbin_id); - - --- --- Name: roas_pe_group_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pe_group_bk_uk UNIQUE (pers_id_grantee, role_code, grou_id); - - --- --- Name: roas_pe_instance_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pe_instance_bk_uk UNIQUE (pers_id_grantee, role_code, dbin_id); - - --- --- Name: roas_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pk PRIMARY KEY (id); - - --- --- Name: samp_pi_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pi_uk UNIQUE (perm_id); - - --- --- Name: samp_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pk PRIMARY KEY (id); - - --- --- Name: sapr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_bk_uk UNIQUE (samp_id, stpt_id); - - --- --- Name: sapr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_pk PRIMARY KEY (id); - - --- --- Name: saty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: saty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_pk PRIMARY KEY (id); - - --- --- Name: stpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_bk_uk UNIQUE (saty_id, prty_id); - - --- --- Name: stpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_pk PRIMARY KEY (id); - - --- --- Name: atta_exac_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_exac_fk_i ON attachments USING btree (exac_id); - - --- --- Name: atta_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_expe_fk_i ON attachments USING btree (expe_id); - - --- --- Name: atta_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_pers_fk_i ON attachments USING btree (pers_id_registerer); - - --- --- Name: atta_proj_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_proj_fk_i ON attachments USING btree (proj_id); - - --- --- Name: atta_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_samp_fk_i ON attachments USING btree (samp_id); - - --- --- Name: covo_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX covo_pers_fk_i ON controlled_vocabularies USING btree (pers_id_registerer); - - --- --- Name: cvte_covo_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX cvte_covo_fk_i ON controlled_vocabulary_terms USING btree (covo_id); - - --- --- Name: cvte_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX cvte_pers_fk_i ON controlled_vocabulary_terms USING btree (pers_id_registerer); - - --- --- Name: dast_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dast_dbin_fk_i ON data_stores USING btree (dbin_id); - - --- --- Name: data_dsty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_dsty_fk_i ON data USING btree (dsty_id); - - --- --- Name: data_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_expe_fk_i ON data USING btree (expe_id); - - --- --- Name: data_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_samp_fk_i ON data USING btree (samp_id); - - --- --- Name: dspr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_cvte_fk_i ON data_set_properties USING btree (cvte_id); - - --- --- Name: dspr_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_ds_fk_i ON data_set_properties USING btree (ds_id); - - --- --- Name: dspr_dstpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_dstpt_fk_i ON data_set_properties USING btree (dstpt_id); - - --- --- Name: dspr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_pers_fk_i ON data_set_properties USING btree (pers_id_registerer); - - --- --- Name: dsre_data_fk_i_child; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsre_data_fk_i_child ON data_set_relationships USING btree (data_id_child); - - --- --- Name: dsre_data_fk_i_parent; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsre_data_fk_i_parent ON data_set_relationships USING btree (data_id_parent); - - --- --- Name: dssdst_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dssdst_ds_fk_i ON data_store_service_data_set_types USING btree (data_store_service_id); - - --- --- Name: dssdst_dst_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dssdst_dst_fk_i ON data_store_service_data_set_types USING btree (data_set_type_id); - - --- --- Name: dsse_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsse_ds_fk_i ON data_store_services USING btree (data_store_id); - - --- --- Name: dstpt_dsty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_dsty_fk_i ON data_set_type_property_types USING btree (dsty_id); - - --- --- Name: dstpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_pers_fk_i ON data_set_type_property_types USING btree (pers_id_registerer); - - --- --- Name: dstpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_prty_fk_i ON data_set_type_property_types USING btree (prty_id); - - --- --- Name: etpt_exty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_exty_fk_i ON experiment_type_property_types USING btree (exty_id); - - --- --- Name: etpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_pers_fk_i ON experiment_type_property_types USING btree (pers_id_registerer); - - --- --- Name: etpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_prty_fk_i ON experiment_type_property_types USING btree (prty_id); - - --- --- Name: evnt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX evnt_pers_fk_i ON events USING btree (pers_id_registerer); - - --- --- Name: exda_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_cvte_fk_i ON external_data USING btree (cvte_id_stor_fmt); - - --- --- Name: exda_cvte_stored_on_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_cvte_stored_on_fk_i ON external_data USING btree (cvte_id_store); - - --- --- Name: exda_ffty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_ffty_fk_i ON external_data USING btree (ffty_id); - - --- --- Name: exda_loty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_loty_fk_i ON external_data USING btree (loty_id); - - --- --- Name: expe_exty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_exty_fk_i ON experiments USING btree (exty_id); - - --- --- Name: expe_inva_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_inva_fk_i ON experiments USING btree (inva_id); - - --- --- Name: expe_mate_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_mate_fk_i ON experiments USING btree (mate_id_study_object); - - --- --- Name: expe_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_pers_fk_i ON experiments USING btree (pers_id_registerer); - - --- --- Name: expe_proj_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_proj_fk_i ON experiments USING btree (proj_id); - - --- --- Name: expr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_cvte_fk_i ON experiment_properties USING btree (cvte_id); - - --- --- Name: expr_etpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_etpt_fk_i ON experiment_properties USING btree (etpt_id); - - --- --- Name: expr_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_expe_fk_i ON experiment_properties USING btree (expe_id); - - --- --- Name: expr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_pers_fk_i ON experiment_properties USING btree (pers_id_registerer); - - --- --- Name: filt_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX filt_dbin_fk_i ON filters USING btree (dbin_id); - - --- --- Name: filt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX filt_pers_fk_i ON filters USING btree (pers_id_registerer); - - --- --- Name: grid_custom_columns_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grid_custom_columns_dbin_fk_i ON grid_custom_columns USING btree (dbin_id); - - --- --- Name: grid_custom_columns_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grid_custom_columns_pers_fk_i ON grid_custom_columns USING btree (pers_id_registerer); - - --- --- Name: grou_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grou_dbin_fk_i ON groups USING btree (dbin_id); - - --- --- Name: grou_pers_registered_by_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grou_pers_registered_by_fk_i ON groups USING btree (pers_id_registerer); - - --- --- Name: inva_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX inva_pers_fk_i ON invalidations USING btree (pers_id_registerer); - - --- --- Name: mapr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_cvte_fk_i ON material_properties USING btree (cvte_id); - - --- --- Name: mapr_mate_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_mate_fk_i ON material_properties USING btree (mate_id); - - --- --- Name: mapr_mtpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_mtpt_fk_i ON material_properties USING btree (mtpt_id); - - --- --- Name: mapr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_pers_fk_i ON material_properties USING btree (pers_id_registerer); - - --- --- Name: mate_maty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mate_maty_fk_i ON materials USING btree (maty_id); - - --- --- Name: mate_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mate_pers_fk_i ON materials USING btree (pers_id_registerer); - - --- --- Name: mtpt_maty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_maty_fk_i ON material_type_property_types USING btree (maty_id); - - --- --- Name: mtpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_pers_fk_i ON material_type_property_types USING btree (pers_id_registerer); - - --- --- Name: mtpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_prty_fk_i ON material_type_property_types USING btree (prty_id); - - --- --- Name: pers_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX pers_grou_fk_i ON persons USING btree (grou_id); - - --- --- Name: proj_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_grou_fk_i ON projects USING btree (grou_id); - - --- --- Name: proj_pers_fk_i_leader; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_pers_fk_i_leader ON projects USING btree (pers_id_leader); - - --- --- Name: proj_pers_fk_i_registerer; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_pers_fk_i_registerer ON projects USING btree (pers_id_registerer); - - --- --- Name: prty_covo_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_covo_fk_i ON property_types USING btree (covo_id); - - --- --- Name: prty_daty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_daty_fk_i ON property_types USING btree (daty_id); - - --- --- Name: prty_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_pers_fk_i ON property_types USING btree (pers_id_registerer); - - --- --- Name: roas_ag_fk_i_grantee; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_ag_fk_i_grantee ON role_assignments USING btree (ag_id_grantee); - - --- --- Name: roas_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_dbin_fk_i ON role_assignments USING btree (dbin_id); - - --- --- Name: roas_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_grou_fk_i ON role_assignments USING btree (grou_id); - - --- --- Name: roas_pers_fk_i_grantee; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_pers_fk_i_grantee ON role_assignments USING btree (pers_id_grantee); - - --- --- Name: roas_pers_fk_i_registerer; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_pers_fk_i_registerer ON role_assignments USING btree (pers_id_registerer); - - --- --- Name: samp_code_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_code_i ON samples USING btree (code); - - --- --- Name: samp_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_expe_fk_i ON samples USING btree (expe_id); - - --- --- Name: samp_inva_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_inva_fk_i ON samples USING btree (inva_id); - - --- --- Name: samp_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_pers_fk_i ON samples USING btree (pers_id_registerer); - - --- --- Name: samp_samp_fk_i_control_layout; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_control_layout ON samples USING btree (samp_id_control_layout); - - --- --- Name: samp_samp_fk_i_generated_from; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_generated_from ON samples USING btree (samp_id_generated_from); - - --- --- Name: samp_samp_fk_i_part_of; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_part_of ON samples USING btree (samp_id_part_of); - - --- --- Name: samp_samp_fk_i_top; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_top ON samples USING btree (samp_id_top); - - --- --- Name: samp_saty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_saty_fk_i ON samples USING btree (saty_id); - - --- --- Name: sapr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_cvte_fk_i ON sample_properties USING btree (cvte_id); - - --- --- Name: sapr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_pers_fk_i ON sample_properties USING btree (pers_id_registerer); - - --- --- Name: sapr_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_samp_fk_i ON sample_properties USING btree (samp_id); - - --- --- Name: sapr_stpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_stpt_fk_i ON sample_properties USING btree (stpt_id); - - --- --- Name: stpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_pers_fk_i ON sample_type_property_types USING btree (pers_id_registerer); - - --- --- Name: stpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_prty_fk_i ON sample_type_property_types USING btree (prty_id); - - --- --- Name: stpt_saty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_saty_fk_i ON sample_type_property_types USING btree (saty_id); - - --- --- Name: check_dataset_relationships_on_data_table_modification; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_data_table_modification - AFTER INSERT OR UPDATE ON data -DEFERRABLE INITIALLY DEFERRED - FOR EACH ROW - EXECUTE PROCEDURE check_dataset_relationships_on_data_table_modification(); - - --- --- Name: check_dataset_relationships_on_relationships_table_modification; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_relationships_table_modification - AFTER INSERT OR UPDATE ON data_set_relationships -DEFERRABLE INITIALLY DEFERRED - FOR EACH ROW - EXECUTE PROCEDURE check_dataset_relationships_on_relationships_table_modification(); - - --- --- Name: controlled_vocabulary_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER controlled_vocabulary_check - BEFORE INSERT OR UPDATE ON property_types - FOR EACH ROW - EXECUTE PROCEDURE controlled_vocabulary_check(); - - --- --- Name: data_set_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER data_set_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON data_set_properties - FOR EACH ROW - EXECUTE PROCEDURE data_set_property_with_material_data_type_check(); - - --- --- Name: experiment_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER experiment_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON experiment_properties - FOR EACH ROW - EXECUTE PROCEDURE experiment_property_with_material_data_type_check(); - - --- --- Name: external_data_storage_format_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER external_data_storage_format_check - BEFORE INSERT OR UPDATE ON external_data - FOR EACH ROW - EXECUTE PROCEDURE external_data_storage_format_check(); - - --- --- Name: material_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER material_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON material_properties - FOR EACH ROW - EXECUTE PROCEDURE material_property_with_material_data_type_check(); - - --- --- Name: sample_code_uniqueness_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER sample_code_uniqueness_check - BEFORE INSERT OR UPDATE ON samples - FOR EACH ROW - EXECUTE PROCEDURE sample_code_uniqueness_check(); - - --- --- Name: sample_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER sample_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON sample_properties - FOR EACH ROW - EXECUTE PROCEDURE sample_property_with_material_data_type_check(); - - --- --- Name: sample_subcode_uniqueness_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER sample_subcode_uniqueness_check - BEFORE INSERT OR UPDATE ON samples - FOR EACH ROW - EXECUTE PROCEDURE sample_subcode_uniqueness_check(); - - --- --- Name: ag_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: ag_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: agp_ag_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_ag_fk FOREIGN KEY (ag_id) REFERENCES authorization_groups(id); - - --- --- Name: agp_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_pers_fk FOREIGN KEY (pers_id) REFERENCES persons(id); - - --- --- Name: atta_cont_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_cont_fk FOREIGN KEY (exac_id) REFERENCES attachment_contents(id); - - --- --- Name: atta_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: atta_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: atta_proj_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id); - - --- --- Name: atta_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: covo_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: covo_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: cvte_covo_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_covo_fk FOREIGN KEY (covo_id) REFERENCES controlled_vocabularies(id); - - --- --- Name: cvte_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dast_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: data_dast_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_dast_fk FOREIGN KEY (dast_id) REFERENCES data_stores(id); - - --- --- Name: data_dsty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_dsty_fk FOREIGN KEY (dsty_id) REFERENCES data_set_types(id); - - --- --- Name: data_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: data_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: dspr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: dspr_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_ds_fk FOREIGN KEY (ds_id) REFERENCES data(id); - - --- --- Name: dspr_dstpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_dstpt_fk FOREIGN KEY (dstpt_id) REFERENCES data_set_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: dspr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: dspr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dsre_data_fk_child; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_data_fk_child FOREIGN KEY (data_id_child) REFERENCES data(id); - - --- --- Name: dsre_data_fk_parent; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_data_fk_parent FOREIGN KEY (data_id_parent) REFERENCES data(id); - - --- --- Name: dssdst_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_ds_fk FOREIGN KEY (data_store_service_id) REFERENCES data_store_services(id) ON DELETE CASCADE; - - --- --- Name: dssdst_dst_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_dst_fk FOREIGN KEY (data_set_type_id) REFERENCES data_set_types(id) ON DELETE CASCADE; - - --- --- Name: dsse_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_ds_fk FOREIGN KEY (data_store_id) REFERENCES data_stores(id) ON DELETE CASCADE; - - --- --- Name: dstpt_dsty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_dsty_fk FOREIGN KEY (dsty_id) REFERENCES data_set_types(id) ON DELETE CASCADE; - - --- --- Name: dstpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dstpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: dsty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: etpt_exty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_exty_fk FOREIGN KEY (exty_id) REFERENCES experiment_types(id) ON DELETE CASCADE; - - --- --- Name: etpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: etpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: evnt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY events - ADD CONSTRAINT evnt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: exda_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_cvte_fk FOREIGN KEY (cvte_id_stor_fmt) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: exda_cvte_stored_on_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_cvte_stored_on_fk FOREIGN KEY (cvte_id_store) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: exda_data_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_data_fk FOREIGN KEY (data_id) REFERENCES data(id); - - --- --- Name: exda_ffty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_ffty_fk FOREIGN KEY (ffty_id) REFERENCES file_format_types(id); - - --- --- Name: exda_loty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_loty_fk FOREIGN KEY (loty_id) REFERENCES locator_types(id); - - --- --- Name: expe_exty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_exty_fk FOREIGN KEY (exty_id) REFERENCES experiment_types(id); - - --- --- Name: expe_inva_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_inva_fk FOREIGN KEY (inva_id) REFERENCES invalidations(id); - - --- --- Name: expe_mate_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_mate_fk FOREIGN KEY (mate_id_study_object) REFERENCES materials(id); - - --- --- Name: expe_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: expe_proj_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id); - - --- --- Name: expr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: expr_etpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_etpt_fk FOREIGN KEY (etpt_id) REFERENCES experiment_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: expr_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: expr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: expr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: exty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: ffty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: filt_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: filt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: grid_custom_columns_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: grid_custom_columns_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: grou_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: grou_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: inva_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY invalidations - ADD CONSTRAINT inva_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mapr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: mapr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: mapr_mate_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mate_fk FOREIGN KEY (mate_id) REFERENCES materials(id); - - --- --- Name: mapr_mtpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mtpt_fk FOREIGN KEY (mtpt_id) REFERENCES material_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: mapr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mate_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: mate_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_maty_fk FOREIGN KEY (maty_id) REFERENCES material_types(id); - - --- --- Name: mate_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: maty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: mtpt_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_maty_fk FOREIGN KEY (maty_id) REFERENCES material_types(id) ON DELETE CASCADE; - - --- --- Name: mtpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mtpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: pers_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: pers_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: pers_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: proj_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: proj_pers_fk_leader; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pers_fk_leader FOREIGN KEY (pers_id_leader) REFERENCES persons(id); - - --- --- Name: proj_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: prty_covo_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_covo_fk FOREIGN KEY (covo_id) REFERENCES controlled_vocabularies(id); - - --- --- Name: prty_daty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_daty_fk FOREIGN KEY (daty_id) REFERENCES data_types(id); - - --- --- Name: prty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: prty_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_maty_fk FOREIGN KEY (maty_prop_id) REFERENCES material_types(id) ON DELETE CASCADE; - - --- --- Name: prty_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: quer_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: quer_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: roas_ag_fk_grantee; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_fk_grantee FOREIGN KEY (ag_id_grantee) REFERENCES authorization_groups(id); - - --- --- Name: roas_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: roas_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: roas_pers_fk_grantee; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pers_fk_grantee FOREIGN KEY (pers_id_grantee) REFERENCES persons(id); - - --- --- Name: roas_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: samp_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: samp_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: samp_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: samp_inva_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_inva_fk FOREIGN KEY (inva_id) REFERENCES invalidations(id); - - --- --- Name: samp_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: samp_samp_fk_control_layout; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_control_layout FOREIGN KEY (samp_id_control_layout) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_generated_from; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_generated_from FOREIGN KEY (samp_id_generated_from) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_part_of; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_part_of FOREIGN KEY (samp_id_part_of) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_top; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_top FOREIGN KEY (samp_id_top) REFERENCES samples(id); - - --- --- Name: samp_saty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_saty_fk FOREIGN KEY (saty_id) REFERENCES sample_types(id); - - --- --- Name: sapr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: sapr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: sapr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: sapr_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: sapr_stpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_stpt_fk FOREIGN KEY (stpt_id) REFERENCES sample_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: saty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: stpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: stpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: stpt_saty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_saty_fk FOREIGN KEY (saty_id) REFERENCES sample_types(id) ON DELETE CASCADE; - - --- --- PostgreSQL database dump complete --- - diff --git a/plasmid/resource/db/plasmids.sql b/plasmid/resource/db/plasmids.sql deleted file mode 100644 index 596c73888da4da22bc96bc0d9eacac1d8ba5f741..0000000000000000000000000000000000000000 --- a/plasmid/resource/db/plasmids.sql +++ /dev/null @@ -1,4625 +0,0 @@ --- --- PostgreSQL database dump --- - -SET statement_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = off; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET escape_string_warning = off; - --- --- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: - --- - -CREATE PROCEDURAL LANGUAGE plpgsql; - - -SET search_path = public, pg_catalog; - --- --- Name: archiving_status; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN archiving_status AS character varying(100) - CONSTRAINT archiving_status_check CHECK (((VALUE)::text = ANY ((ARRAY['LOCKED'::character varying, 'AVAILABLE'::character varying, 'ARCHIVED'::character varying, 'ARCHIVE_PENDING'::character varying, 'UNARCHIVE_PENDING'::character varying])::text[]))); - - --- --- Name: authorization_role; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN authorization_role AS character varying(40) - CONSTRAINT authorization_role_check CHECK (((VALUE)::text = ANY ((ARRAY['ADMIN'::character varying, 'POWER_USER'::character varying, 'USER'::character varying, 'OBSERVER'::character varying, 'ETL_SERVER'::character varying])::text[]))); - - --- --- Name: boolean_char; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN boolean_char AS boolean DEFAULT false; - - --- --- Name: boolean_char_or_unknown; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN boolean_char_or_unknown AS character(1) DEFAULT 'U'::bpchar - CONSTRAINT boolean_char_or_unknown_check CHECK ((VALUE = ANY (ARRAY['F'::bpchar, 'T'::bpchar, 'U'::bpchar]))); - - --- --- Name: code; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN code AS character varying(60); - - --- --- Name: column_label; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN column_label AS character varying(128); - - --- --- Name: data_store_service_kind; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN data_store_service_kind AS character varying(40) - CONSTRAINT data_store_service_kind_check CHECK (((VALUE)::text = ANY ((ARRAY['PROCESSING'::character varying, 'QUERIES'::character varying])::text[]))); - - --- --- Name: description_2000; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN description_2000 AS character varying(2000); - - --- --- Name: event_type; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN event_type AS character varying(40) - CONSTRAINT event_type_check CHECK (((VALUE)::text = ANY ((ARRAY['DELETION'::character varying, 'INVALIDATION'::character varying, 'MOVEMENT'::character varying])::text[]))); - - --- --- Name: file; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN file AS bytea; - - --- --- Name: file_name; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN file_name AS character varying(100); - - --- --- Name: generic_value; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN generic_value AS character varying(1024); - - --- --- Name: grid_expression; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN grid_expression AS character varying(2000); - - --- --- Name: grid_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN grid_id AS character varying(200); - - --- --- Name: object_name; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN object_name AS character varying(50); - - --- --- Name: ordinal_int; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN ordinal_int AS bigint - CONSTRAINT ordinal_int_check CHECK ((VALUE > 0)); - - --- --- Name: query_type; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN query_type AS character varying(40) - CONSTRAINT query_type_check CHECK (((VALUE)::text = ANY ((ARRAY['GENERIC'::character varying, 'EXPERIMENT'::character varying, 'SAMPLE'::character varying, 'DATA_SET'::character varying, 'MATERIAL'::character varying])::text[]))); - - --- --- Name: real_value; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN real_value AS real; - - --- --- Name: tech_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN tech_id AS bigint; - - --- --- Name: time_stamp; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN time_stamp AS timestamp with time zone; - - --- --- Name: time_stamp_dfl; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN time_stamp_dfl AS timestamp with time zone NOT NULL DEFAULT now(); - - --- --- Name: title_100; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN title_100 AS character varying(100); - - --- --- Name: user_id; Type: DOMAIN; Schema: public; Owner: - --- - -CREATE DOMAIN user_id AS character varying(50); - - --- --- Name: check_dataset_relationships_on_data_table_modification(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION check_dataset_relationships_on_data_table_modification() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; -BEGIN - -- if there is a connection with a Sample there should not be any connection with a parent Data Set - IF (NEW.samp_id IS NOT NULL) THEN - -- count number of parents - SELECT count(*) INTO counter - FROM data_set_relationships - WHERE data_id_child = NEW.id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected with a Sample and a parent Data Set at the same time.', NEW.code; - END IF; - END IF; - RETURN NEW; -END; -$$; - - --- --- Name: check_dataset_relationships_on_relationships_table_modification(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION check_dataset_relationships_on_relationships_table_modification() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; - sample_id TECH_ID; - data_code CODE; -BEGIN - -- child will have a parent added so it should not be connected with any sample - SELECT samp_id, code INTO sample_id, data_code - FROM data - WHERE id = NEW.data_id_child; - IF (sample_id IS NOT NULL) THEN - RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected to a Sample and to a parent Data Set at the same time.', data_code; - END IF; - RETURN NEW; -END; -$$; - - --- --- Name: controlled_vocabulary_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION controlled_vocabulary_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_code CODE; -BEGIN - - select code into v_code from data_types where id = NEW.daty_id; - - -- Check if the data is of type "CONTROLLEDVOCABULARY" - if v_code = 'CONTROLLEDVOCABULARY' then - if NEW.covo_id IS NULL then - RAISE EXCEPTION 'Insert/Update of Property Type (Code: %) failed, as its Data Type is CONTROLLEDVOCABULARY, but it is not linked to a Controlled Vocabulary.', NEW.code; - end if; - end if; - - RETURN NEW; - -END; -$$; - - --- --- Name: data_set_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION data_set_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from data_set_type_property_types dstpt, property_types pt - where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: experiment_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION experiment_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from experiment_type_property_types etpt, property_types pt - where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: external_data_storage_format_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION external_data_storage_format_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_covo_code CODE; - data_code CODE; -BEGIN - - select code into v_covo_code from controlled_vocabularies - where is_internal_namespace = true and - id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt); - -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT" - if v_covo_code != 'STORAGE_FORMAT' then - select code into data_code from data where id = NEW.data_id; - RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', data_code, v_covo_code; - end if; - - RETURN NEW; - -END; -$$; - - --- --- Name: material_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION material_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from material_type_property_types etpt, property_types pt - where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: rename_sequence(character varying, character varying); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION rename_sequence(old_name character varying, new_name character varying) RETURNS integer - LANGUAGE plpgsql - AS $$ -DECLARE - CURR_SEQ_VAL INTEGER; -BEGIN - SELECT INTO CURR_SEQ_VAL NEXTVAL(OLD_NAME); - EXECUTE 'CREATE SEQUENCE ' || NEW_NAME || ' START WITH ' || CURR_SEQ_VAL; - EXECUTE 'DROP SEQUENCE ' || OLD_NAME; - RETURN CURR_SEQ_VAL; -END; -$$; - - --- --- Name: sample_code_uniqueness_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION sample_code_uniqueness_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - counter INTEGER; -BEGIN - LOCK TABLE samples IN EXCLUSIVE MODE; - IF (NEW.samp_id_part_of is NULL) THEN - IF (NEW.dbin_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code; - END IF; - ELSIF (NEW.grou_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code; - END IF; - END IF; - ELSE - IF (NEW.dbin_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code; - END IF; - ELSIF (NEW.grou_id is not NULL) THEN - SELECT count(*) into counter FROM samples - where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id; - IF (counter > 0) THEN - RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code; - END IF; - END IF; - END IF; - RETURN NEW; -END; -$$; - - --- --- Name: sample_property_with_material_data_type_check(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION sample_property_with_material_data_type_check() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_type_id CODE; - v_type_id_prop CODE; -BEGIN - if NEW.mate_prop_id IS NOT NULL then - -- find material type id of the property type - select pt.maty_prop_id into v_type_id_prop - from sample_type_property_types etpt, property_types pt - where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id; - - if v_type_id_prop IS NOT NULL then - -- find material type id of the material which consists the entity's property value - select entity.maty_id into v_type_id - from materials entity - where NEW.mate_prop_id = entity.id; - if v_type_id != v_type_id_prop then - RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', - NEW.mate_prop_id, v_type_id, v_type_id_prop; - end if; - end if; - end if; - RETURN NEW; -END; -$$; - - --- --- Name: attachment_content_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE attachment_content_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: attachment_content_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('attachment_content_id_seq', 1, true); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: attachment_contents; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE attachment_contents ( - id tech_id NOT NULL, - value file NOT NULL -); - - --- --- Name: attachment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE attachment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: attachment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('attachment_id_seq', 1, true); - - --- --- Name: attachments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE attachments ( - id tech_id NOT NULL, - expe_id tech_id, - samp_id tech_id, - proj_id tech_id, - exac_id tech_id NOT NULL, - file_name file_name NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - version integer NOT NULL, - pers_id_registerer tech_id NOT NULL, - title title_100, - description description_2000, - CONSTRAINT atta_arc_ck CHECK ((((((expe_id IS NOT NULL) AND (proj_id IS NULL)) AND (samp_id IS NULL)) OR (((expe_id IS NULL) AND (proj_id IS NOT NULL)) AND (samp_id IS NULL))) OR (((expe_id IS NULL) AND (proj_id IS NULL)) AND (samp_id IS NOT NULL)))) -); - - --- --- Name: authorization_group_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE authorization_group_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: authorization_group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('authorization_group_id_seq', 2, false); - - --- --- Name: authorization_group_persons; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE authorization_group_persons ( - ag_id tech_id NOT NULL, - pers_id tech_id NOT NULL -); - - --- --- Name: authorization_groups; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE authorization_groups ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: code_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE code_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: code_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('code_seq', 100, true); - - --- --- Name: controlled_vocabularies; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE controlled_vocabularies ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - is_internal_namespace boolean_char DEFAULT false NOT NULL, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_chosen_from_list boolean_char DEFAULT true NOT NULL, - source_uri character varying(250) -); - - --- --- Name: controlled_vocabulary_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE controlled_vocabulary_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: controlled_vocabulary_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('controlled_vocabulary_id_seq', 7, true); - - --- --- Name: controlled_vocabulary_terms; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE controlled_vocabulary_terms ( - id tech_id NOT NULL, - code object_name NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - covo_id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - label column_label, - description description_2000, - ordinal ordinal_int NOT NULL, - CONSTRAINT cvte_ck CHECK (((ordinal)::bigint > 0)) -); - - --- --- Name: cvte_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE cvte_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: cvte_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('cvte_id_seq', 61, true); - - --- --- Name: data; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data ( - id tech_id NOT NULL, - code code, - dsty_id tech_id NOT NULL, - dast_id tech_id NOT NULL, - expe_id tech_id NOT NULL, - data_producer_code code, - production_timestamp time_stamp, - samp_id tech_id, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - is_placeholder boolean_char DEFAULT false, - is_valid boolean_char DEFAULT true, - modification_timestamp time_stamp DEFAULT now(), - is_derived boolean_char NOT NULL -); - - --- --- Name: data_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_id_seq', 1, true); - - --- --- Name: data_set_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_properties ( - id tech_id NOT NULL, - ds_id tech_id NOT NULL, - dstpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT dspr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: data_set_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_property_id_seq', 9, true); - - --- --- Name: data_set_relationship_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_relationship_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_relationship_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_relationship_id_seq', 1, false); - - --- --- Name: data_set_relationships; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_relationships ( - data_id_parent tech_id NOT NULL, - data_id_child tech_id NOT NULL -); - - --- --- Name: data_set_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_set_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_set_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_set_type_id_seq', 4, true); - - --- --- Name: data_set_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_type_property_types ( - id tech_id NOT NULL, - dsty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: data_set_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_set_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - main_ds_pattern character varying(300), - main_ds_path character varying(1000) -); - - --- --- Name: data_store_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_store_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_store_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_store_id_seq', 1, true); - - --- --- Name: data_store_service_data_set_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_store_service_data_set_types ( - data_store_service_id tech_id NOT NULL, - data_set_type_id tech_id NOT NULL -); - - --- --- Name: data_store_services; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_store_services ( - id tech_id NOT NULL, - key character varying(256) NOT NULL, - label character varying(256) NOT NULL, - kind data_store_service_kind NOT NULL, - data_store_id tech_id NOT NULL -); - - --- --- Name: data_store_services_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_store_services_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_store_services_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_store_services_id_seq', 12, true); - - --- --- Name: data_stores; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_stores ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code code NOT NULL, - download_url character varying(1024) NOT NULL, - remote_url character varying(250) NOT NULL, - session_token character varying(50) NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_archiver_configured boolean_char DEFAULT false NOT NULL -); - - --- --- Name: data_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE data_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: data_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('data_type_id_seq', 9, true); - - --- --- Name: data_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE data_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 NOT NULL -); - - --- --- Name: database_instance_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE database_instance_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: database_instance_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('database_instance_id_seq', 1, true); - - --- --- Name: database_instances; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE database_instances ( - id tech_id NOT NULL, - code code NOT NULL, - uuid code NOT NULL, - is_original_source boolean_char DEFAULT false NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL -); - - --- --- Name: database_version_logs; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE database_version_logs ( - db_version character varying(4) NOT NULL, - module_name character varying(250), - run_status character varying(10), - run_status_timestamp timestamp without time zone, - module_code bytea, - run_exception bytea -); - - --- --- Name: dstpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE dstpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: dstpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('dstpt_id_seq', 3, true); - - --- --- Name: etpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE etpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: etpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('etpt_id_seq', 1, false); - - --- --- Name: event_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE event_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: event_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('event_id_seq', 1, true); - - --- --- Name: events; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE events ( - id tech_id NOT NULL, - event_type event_type NOT NULL, - description description_2000, - reason description_2000, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - entity_type character varying(80) NOT NULL, - identifier character varying(250) NOT NULL, - CONSTRAINT evnt_et_enum_ck CHECK (((entity_type)::text = ANY ((ARRAY['ATTACHMENT'::character varying, 'DATASET'::character varying, 'EXPERIMENT'::character varying, 'GROUP'::character varying, 'MATERIAL'::character varying, 'PROJECT'::character varying, 'PROPERTY_TYPE'::character varying, 'SAMPLE'::character varying, 'VOCABULARY'::character varying, 'AUTHORIZATION_GROUP'::character varying])::text[]))) -); - - --- --- Name: experiment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_id_seq', 1, true); - - --- --- Name: experiment_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_properties ( - id tech_id NOT NULL, - expe_id tech_id NOT NULL, - etpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT expr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: experiment_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_property_id_seq', 1, false); - - --- --- Name: experiment_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE experiment_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: experiment_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('experiment_type_id_seq', 1, true); - - --- --- Name: experiment_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_type_property_types ( - id tech_id NOT NULL, - exty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: experiment_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiment_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: experiments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE experiments ( - id tech_id NOT NULL, - perm_id code NOT NULL, - code code NOT NULL, - exty_id tech_id NOT NULL, - mate_id_study_object tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - proj_id tech_id NOT NULL, - inva_id tech_id, - is_public boolean_char DEFAULT false NOT NULL -); - - --- --- Name: external_data; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE external_data ( - data_id tech_id NOT NULL, - location character varying(1024) NOT NULL, - ffty_id tech_id NOT NULL, - loty_id tech_id NOT NULL, - cvte_id_stor_fmt tech_id NOT NULL, - is_complete boolean_char_or_unknown DEFAULT 'U'::bpchar NOT NULL, - cvte_id_store tech_id, - status archiving_status DEFAULT 'AVAILABLE'::character varying NOT NULL -); - - --- --- Name: file_format_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE file_format_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: file_format_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('file_format_type_id_seq', 7, true); - - --- --- Name: file_format_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE file_format_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL -); - - --- --- Name: filter_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE filter_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: filter_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('filter_id_seq', 1, true); - - --- --- Name: filters; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE filters ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - name character varying(200) NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression character varying(2000) NOT NULL, - is_public boolean NOT NULL, - grid_id character varying(200) NOT NULL -); - - --- --- Name: grid_custom_columns; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE grid_custom_columns ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - code character varying(200) NOT NULL, - label column_label NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression grid_expression NOT NULL, - is_public boolean NOT NULL, - grid_id grid_id NOT NULL -); - - --- --- Name: grid_custom_columns_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE grid_custom_columns_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: grid_custom_columns_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('grid_custom_columns_id_seq', 1, false); - - --- --- Name: group_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE group_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('group_id_seq', 1, true); - - --- --- Name: groups; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE groups ( - id tech_id NOT NULL, - code code NOT NULL, - dbin_id tech_id NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL -); - - --- --- Name: invalidation_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE invalidation_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: invalidation_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('invalidation_id_seq', 1, false); - - --- --- Name: invalidations; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE invalidations ( - id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - reason description_2000 -); - - --- --- Name: locator_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE locator_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: locator_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('locator_type_id_seq', 1, true); - - --- --- Name: locator_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE locator_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 -); - - --- --- Name: material_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_id_seq', 1, false); - - --- --- Name: material_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_properties ( - id tech_id NOT NULL, - mate_id tech_id NOT NULL, - mtpt_id tech_id NOT NULL, - value generic_value, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - pers_id_registerer tech_id NOT NULL, - cvte_id tech_id, - mate_prop_id tech_id, - CONSTRAINT mapr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: material_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_property_id_seq', 1, false); - - --- --- Name: material_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE material_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: material_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('material_type_id_seq', 2, true); - - --- --- Name: material_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_type_property_types ( - id tech_id NOT NULL, - maty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: material_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE material_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: materials; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE materials ( - id tech_id NOT NULL, - code code NOT NULL, - maty_id tech_id NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - dbin_id tech_id NOT NULL -); - - --- --- Name: mtpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE mtpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: mtpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('mtpt_id_seq', 1, false); - - --- --- Name: perm_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE perm_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: perm_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('perm_id_seq', 100, true); - - --- --- Name: person_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE person_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: person_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('person_id_seq', 14, true); - - --- --- Name: persons; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE persons ( - id tech_id NOT NULL, - first_name character varying(30), - last_name character varying(30), - user_id user_id NOT NULL, - email object_name, - dbin_id tech_id NOT NULL, - grou_id tech_id, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id, - display_settings file -); - - --- --- Name: project_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE project_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: project_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('project_id_seq', 1, true); - - --- --- Name: projects; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE projects ( - id tech_id NOT NULL, - code code NOT NULL, - grou_id tech_id NOT NULL, - pers_id_leader tech_id, - description description_2000, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now() -); - - --- --- Name: property_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE property_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: property_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('property_type_id_seq', 18, true); - - --- --- Name: property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE property_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000 NOT NULL, - label column_label NOT NULL, - daty_id tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - covo_id tech_id, - is_managed_internally boolean_char DEFAULT false NOT NULL, - is_internal_namespace boolean_char DEFAULT false NOT NULL, - dbin_id tech_id NOT NULL, - maty_prop_id tech_id -); - - --- --- Name: queries; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE queries ( - id tech_id NOT NULL, - dbin_id tech_id NOT NULL, - name character varying(200) NOT NULL, - description description_2000, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - pers_id_registerer tech_id NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - expression character varying(2000) NOT NULL, - is_public boolean NOT NULL, - query_type query_type NOT NULL, - db_key code DEFAULT '1'::character varying NOT NULL -); - - --- --- Name: query_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE query_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: query_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('query_id_seq', 1, false); - - --- --- Name: role_assignment_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE role_assignment_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: role_assignment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('role_assignment_id_seq', 9, true); - - --- --- Name: role_assignments; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE role_assignments ( - id tech_id NOT NULL, - role_code authorization_role NOT NULL, - grou_id tech_id, - dbin_id tech_id, - pers_id_grantee tech_id, - ag_id_grantee tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - CONSTRAINT roas_ag_pers_arc_ck CHECK ((((ag_id_grantee IS NOT NULL) AND (pers_id_grantee IS NULL)) OR ((ag_id_grantee IS NULL) AND (pers_id_grantee IS NOT NULL)))), - CONSTRAINT roas_dbin_grou_arc_ck CHECK ((((dbin_id IS NOT NULL) AND (grou_id IS NULL)) OR ((dbin_id IS NULL) AND (grou_id IS NOT NULL)))) -); - - --- --- Name: sample_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_id_seq', 1, true); - - --- --- Name: sample_properties; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_properties ( - id tech_id NOT NULL, - samp_id tech_id NOT NULL, - stpt_id tech_id NOT NULL, - value generic_value, - cvte_id tech_id, - mate_prop_id tech_id, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - CONSTRAINT sapr_ck CHECK ((((((value IS NOT NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NULL)) OR (((value IS NULL) AND (cvte_id IS NOT NULL)) AND (mate_prop_id IS NULL))) OR (((value IS NULL) AND (cvte_id IS NULL)) AND (mate_prop_id IS NOT NULL)))) -); - - --- --- Name: sample_property_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_property_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_property_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_property_id_seq', 1, true); - - --- --- Name: sample_type_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE sample_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: sample_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('sample_type_id_seq', 2, true); - - --- --- Name: sample_type_property_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_type_property_types ( - id tech_id NOT NULL, - saty_id tech_id NOT NULL, - prty_id tech_id NOT NULL, - is_mandatory boolean_char DEFAULT false NOT NULL, - is_managed_internally boolean_char DEFAULT false NOT NULL, - pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - is_displayed boolean_char DEFAULT true NOT NULL, - ordinal ordinal_int NOT NULL, - section description_2000 -); - - --- --- Name: sample_types; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE sample_types ( - id tech_id NOT NULL, - code code NOT NULL, - description description_2000, - dbin_id tech_id NOT NULL, - is_listable boolean_char DEFAULT true NOT NULL, - generated_from_depth integer DEFAULT 0 NOT NULL, - part_of_depth integer DEFAULT 0 NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - is_auto_generated_code boolean_char DEFAULT false NOT NULL, - generated_code_prefix code DEFAULT 'S'::character varying NOT NULL -); - - --- --- Name: samples; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE samples ( - id tech_id NOT NULL, - perm_id code NOT NULL, - code code NOT NULL, - expe_id tech_id, - samp_id_top tech_id, - samp_id_generated_from tech_id, - saty_id tech_id NOT NULL, - registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL, - modification_timestamp time_stamp DEFAULT now(), - pers_id_registerer tech_id NOT NULL, - inva_id tech_id, - samp_id_control_layout tech_id, - dbin_id tech_id, - grou_id tech_id, - samp_id_part_of tech_id, - CONSTRAINT samp_dbin_grou_arc_ck CHECK ((((dbin_id IS NOT NULL) AND (grou_id IS NULL)) OR ((dbin_id IS NULL) AND (grou_id IS NOT NULL)))) -); - - --- --- Name: stpt_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE stpt_id_seq - START WITH 1 - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - --- --- Name: stpt_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('stpt_id_seq', 18, true); - - --- --- Data for Name: attachment_contents; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY attachment_contents (id, value) FROM stdin; -\. - - --- --- Data for Name: attachments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY attachments (id, expe_id, samp_id, proj_id, exac_id, file_name, registration_timestamp, version, pers_id_registerer, title, description) FROM stdin; -\. - - --- --- Data for Name: authorization_groups; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY authorization_groups (id, dbin_id, code, description, registration_timestamp, pers_id_registerer, modification_timestamp) FROM stdin; -1 1 CISD_ADMINS \N 2010-05-31 21:13:52.3511+02 1 2010-06-01 10:00:46.224+02 -\. - - --- --- Data for Name: authorization_group_persons; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY authorization_group_persons (ag_id, pers_id) FROM stdin; -1 3 -1 4 -1 5 -1 6 -1 7 -1 8 -\. - --- --- Data for Name: controlled_vocabularies; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY controlled_vocabularies (id, code, description, registration_timestamp, pers_id_registerer, is_managed_internally, is_internal_namespace, dbin_id, modification_timestamp, is_chosen_from_list, source_uri) FROM stdin; -1 STORAGE_FORMAT The on-disk storage format of a data set 2010-05-26 13:38:36.62686+02 1 t t 1 2010-05-26 13:38:36.62686+02 t \N -2 OWNER \N 2010-05-26 17:29:55.9819+02 1 f f 1 2010-05-26 17:29:56.019+02 t \N -5 BACTERIAL_ANTIBIOTIC_RESISTANCE Bacterial Antibiotic Resistance 2010-05-26 17:37:11.497201+02 1 f f 1 2010-05-26 17:37:11.497+02 t \N -4 YEAST_MARKER Yeast Marker 2010-05-26 17:35:36.30475+02 1 f f 1 2010-05-26 17:35:36.305+02 t \N -3 BACKBONE \N 2010-05-26 17:32:30.058024+02 1 f f 1 2010-05-26 17:32:30.058+02 t \N -6 BOX_SIZE \N 2010-05-26 21:54:23.206312+02 1 f f 1 2010-05-27 17:48:35.162+02 t \N -7 STORAGE_POSITION_ROW Row in the Box 2010-05-27 17:58:08.636202+02 1 f f 1 2010-05-27 17:58:08.651+02 t \N -\. - - --- --- Data for Name: controlled_vocabulary_terms; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY controlled_vocabulary_terms (id, code, registration_timestamp, covo_id, pers_id_registerer, label, description, ordinal) FROM stdin; -1 PROPRIETARY 2010-05-26 13:38:36.62686+02 1 1 \N \N 1 -2 BDS_DIRECTORY 2010-05-26 13:38:36.62686+02 1 1 \N \N 2 -3 FABIAN_RUDOLF 2010-05-26 17:29:55.9819+02 2 1 Fabian Rudolf \N 1 -4 KRISTINA_ELFSTROM 2010-05-26 17:29:55.9819+02 2 1 Kristina Elfström \N 2 -5 DIANA_OTTOZ 2010-05-26 17:29:55.9819+02 2 1 Diana Ottoz \N 3 -6 BEATA_MIERZWA 2010-05-26 17:29:55.9819+02 2 1 Beata Mierzwa \N 4 -8 MAREIKE_BONGERS 2010-05-26 17:29:55.9819+02 2 1 Mareike Bongers \N 6 -9 MARIO_MARICHISIO 2010-05-26 17:29:55.9819+02 2 1 Mario Marchisio \N 7 -11 PBSN 2010-05-26 17:32:30.058024+02 3 1 pBSN \N 2 -12 PSPPOLY_A 2010-05-26 17:32:30.058024+02 3 1 pSPpoly(A) \N 3 -13 PF6A 2010-05-26 17:32:30.058024+02 3 1 pF6a \N 4 -14 PKERG10Y 2010-05-26 17:32:30.058024+02 3 1 pKERG10y \N 5 -15 PKERG11Y 2010-05-26 17:32:30.058024+02 3 1 pKERG11y \N 6 -16 PKERG12Y 2010-05-26 17:32:30.058024+02 3 1 pKERG12y \N 7 -17 PKERG20Y 2010-05-26 17:32:30.058024+02 3 1 pKERG20y \N 8 -18 PKERG21Y 2010-05-26 17:32:30.058024+02 3 1 pKERG21y \N 9 -19 PKERG22Y 2010-05-26 17:32:30.058024+02 3 1 pKERG22y \N 10 -20 PRS30Y 2010-05-26 17:32:30.058024+02 3 1 pRS30y \N 11 -21 PRS31Y 2010-05-26 17:32:30.058024+02 3 1 pRS31y \N 12 -22 PRS40Y 2010-05-26 17:32:30.058024+02 3 1 pRS40y \N 13 -23 PRS41Y 2010-05-26 17:32:30.058024+02 3 1 pRS41y \N 14 -24 PRS42Y 2010-05-26 17:32:30.058024+02 3 1 pRS42y \N 15 -25 PET22B 2010-05-26 17:32:30.058024+02 3 1 pET22b \N 16 -26 UNKNOWN 2010-05-26 17:32:30.058024+02 3 1 (unknown) \N 17 -27 URA3 2010-05-26 17:35:36.30475+02 4 1 URA3 \N 1 -28 HIS3 2010-05-26 17:35:36.30475+02 4 1 HIS3 \N 2 -29 LEU2 2010-05-26 17:35:36.30475+02 4 1 LEU2 \N 3 -30 TRP1 2010-05-26 17:35:36.30475+02 4 1 TRP1 \N 4 -31 MET15 2010-05-26 17:35:36.30475+02 4 1 MET15 \N 5 -32 LYS2 2010-05-26 17:35:36.30475+02 4 1 LYS2 \N 6 -33 ADE1 2010-05-26 17:35:36.30475+02 4 1 ADE1 \N 7 -34 KANMX 2010-05-26 17:35:36.30475+02 4 1 KanMX \N 8 -35 NATMX 2010-05-26 17:35:36.30475+02 4 1 NatMX \N 9 -36 HYGMX 2010-05-26 17:35:36.30475+02 4 1 HygMX \N 10 -37 URA3MX 2010-05-26 17:35:36.30475+02 4 1 Ura3MX \N 11 -38 HIS3MX 2010-05-26 17:35:36.30475+02 4 1 His3MX \N 12 -39 BLA 2010-05-26 17:37:11.497201+02 5 1 \N \N 1 -40 KAN 2010-05-26 17:37:11.497201+02 5 1 \N \N 2 -41 CAM 2010-05-26 17:37:11.497201+02 5 1 \N \N 3 -7 ROBERT_GNUGGE 2010-05-26 17:29:55.9819+02 2 1 Robert Gnuegge \N 5 -44 96_WELL 2010-05-27 17:48:24.846982+02 6 1 96 Well (8x12) \N 2 -45 384_WELL 2010-05-27 17:48:35.150109+02 6 1 384 Well (16x24) \N 3 -46 A 2010-05-27 17:58:08.636202+02 7 1 \N \N 1 -47 B 2010-05-27 17:58:08.636202+02 7 1 \N \N 2 -48 C 2010-05-27 17:58:08.636202+02 7 1 \N \N 3 -49 D 2010-05-27 17:58:08.636202+02 7 1 \N \N 4 -50 E 2010-05-27 17:58:08.636202+02 7 1 \N \N 5 -51 F 2010-05-27 17:58:08.636202+02 7 1 \N \N 6 -52 G 2010-05-27 17:58:08.636202+02 7 1 \N \N 7 -53 H 2010-05-27 17:58:08.636202+02 7 1 \N \N 8 -54 I 2010-05-27 17:58:08.636202+02 7 1 \N \N 9 -55 J 2010-05-27 17:58:08.636202+02 7 1 \N \N 10 -56 K 2010-05-27 17:58:08.636202+02 7 1 \N \N 11 -57 L 2010-05-27 17:58:08.636202+02 7 1 \N \N 12 -58 M 2010-05-27 17:58:08.636202+02 7 1 \N \N 13 -59 N 2010-05-27 17:58:08.636202+02 7 1 \N \N 14 -60 O 2010-05-27 17:58:08.636202+02 7 1 \N \N 15 -61 P 2010-05-27 17:58:08.636202+02 7 1 \N \N 16 -10 PBLUESCRIPT_II_KS_PLUS 2010-05-26 17:32:30.058024+02 3 1 pBluescript II KS + \N 1 -42 81_BOX 2010-05-26 21:54:23.206312+02 6 1 81 Box (9x9) \N 1 -\. - - --- --- Data for Name: data; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data (id, code, dsty_id, dast_id, expe_id, data_producer_code, production_timestamp, samp_id, registration_timestamp, is_placeholder, is_valid, modification_timestamp, is_derived) FROM stdin; -\. - - --- --- Data for Name: data_set_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_properties (id, ds_id, dstpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: data_set_relationships; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_relationships (data_id_parent, data_id_child) FROM stdin; -\. - - --- --- Data for Name: data_set_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_type_property_types (id, dsty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, ordinal, section) FROM stdin; -1 1 17 t f 1 2010-05-30 12:56:12.273594+02 1 \N -2 2 17 t f 1 2010-05-30 12:56:22.039873+02 1 \N -3 3 17 t f 1 2010-05-30 12:56:29.902648+02 1 \N -4 4 17 t f 1 2010-05-30 12:56:29.902648+02 1 \N -\. - - --- --- Data for Name: data_set_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_set_types (id, code, description, dbin_id, modification_timestamp, main_ds_pattern, main_ds_path) FROM stdin; -1 UNKNOWN \N 1 2010-05-26 17:41:21.272491+02 \N \N -2 SEQ_FILE \N 1 2010-05-26 17:41:21.272491+02 generated\*.svg \N -3 RAW_DATA \N 1 2010-05-26 17:41:58.696032+02 \N \N -4 VERIFICATION \N 1 2010-05-26 17:42:07.328466+02 *.* \N -\. - - --- --- Data for Name: data_store_service_data_set_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_store_service_data_set_types (data_store_service_id, data_set_type_id) FROM stdin; -\. - - --- --- Data for Name: data_store_services; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_store_services (id, key, label, kind, data_store_id) FROM stdin; -\. - - --- --- Data for Name: data_stores; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_stores (id, dbin_id, code, download_url, remote_url, session_token, registration_timestamp, modification_timestamp, is_archiver_configured) FROM stdin; -\. - - --- --- Data for Name: data_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY data_types (id, code, description) FROM stdin; -1 VARCHAR Short text -2 MULTILINE_VARCHAR Long text -3 INTEGER Integer number -4 REAL Real number, i.e. an inexact, variable-precision numeric type -5 BOOLEAN True or False -6 TIMESTAMP Both date and time. Format: yyyy-mm-dd hh:mm:ss -7 CONTROLLEDVOCABULARY Controlled Vocabulary -8 MATERIAL Reference to a material -9 HYPERLINK Address of a web page -\. - - --- --- Data for Name: database_instances; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY database_instances (id, code, uuid, is_original_source, registration_timestamp) FROM stdin; -1 CISD 7ABDB8A8-969C-4E83-BC56-487752B8E6B7 t 2010-05-26 13:38:36.62686+02 -\. - - --- --- Data for Name: database_version_logs; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY database_version_logs (db_version, module_name, run_status, run_status_timestamp, module_code, run_exception) FROM stdin; -052 ./source//sql/postgresql/052/domains-052.sql SUCCESS 2010-05-26 13:38:35.286 -- Creating domains\\012\\012CREATE DOMAIN AUTHORIZATION_ROLE AS VARCHAR(40) CHECK (VALUE IN ('ADMIN', 'POWER_USER', 'USER', 'OBSERVER', 'ETL_SERVER'));\\012CREATE DOMAIN BOOLEAN_CHAR AS BOOLEAN DEFAULT FALSE;\\012CREATE DOMAIN BOOLEAN_CHAR_OR_UNKNOWN AS CHAR(1) DEFAULT 'U' CHECK (VALUE IN ('F', 'T', 'U'));\\012CREATE DOMAIN CODE AS VARCHAR(60);\\012CREATE DOMAIN COLUMN_LABEL AS VARCHAR(128);\\012CREATE DOMAIN DATA_STORE_SERVICE_KIND AS VARCHAR(40) CHECK (VALUE IN ('PROCESSING', 'QUERIES'));\\012CREATE DOMAIN EVENT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DELETION', 'INVALIDATION', 'MOVEMENT'));\\012CREATE DOMAIN FILE AS BYTEA;\\012CREATE DOMAIN FILE_NAME AS VARCHAR(100);\\012CREATE DOMAIN GENERIC_VALUE AS VARCHAR(1024);\\012CREATE DOMAIN OBJECT_NAME AS VARCHAR(50);\\012CREATE DOMAIN REAL_VALUE AS REAL;\\012CREATE DOMAIN TECH_ID AS BIGINT;\\012CREATE DOMAIN TIME_STAMP AS TIMESTAMP WITH TIME ZONE;\\012CREATE DOMAIN TIME_STAMP_DFL AS TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012CREATE DOMAIN USER_ID AS VARCHAR(50);\\012CREATE DOMAIN TITLE_100 AS VARCHAR(100);\\012CREATE DOMAIN GRID_EXPRESSION AS VARCHAR(2000);\\012CREATE DOMAIN GRID_ID AS VARCHAR(200);\\012CREATE DOMAIN ORDINAL_INT AS BIGINT CHECK (VALUE > 0);\\012CREATE DOMAIN DESCRIPTION_2000 AS VARCHAR(2000);\\012CREATE DOMAIN ARCHIVING_STATUS AS VARCHAR(100) CHECK (VALUE IN ('LOCKED', 'AVAILABLE', 'ARCHIVED', 'ARCHIVE_PENDING', 'UNARCHIVE_PENDING'));\\012CREATE DOMAIN QUERY_TYPE AS VARCHAR(40) CHECK (VALUE IN ('GENERIC', 'EXPERIMENT', 'SAMPLE', 'DATA_SET', 'MATERIAL'));\\012 \N -052 ./source//sql/generic/052/schema-052.sql SUCCESS 2010-05-26 13:38:36.471 -- D:\\\\DDL\\\\postgresql\\\\schema-023.sql\\012--\\012-- Generated for ANSI SQL92 on Fri Jul 04 15:13:22 2008 by Server Generator 10.1.2.6.18\\012------------------------------------------------------------------------------------\\012--\\012-- Post-Generation Modifications:\\012--\\012-- 1. Changed domain FILE from BIT(32000) to BYTEA\\012-- 2. Changed domain TECH_ID from NUMERIC(20) to BIGINT\\012-- 3. Changed domain BOOLEAN_CHAR from CHAR(1) DEFAULT F to BOOLEAN DEFAULT FALSE\\012-- 4. Removed the check constraints to handle boolean values in Oracle for the\\012-- tables MATERIAL_TYPE_PROPERTY_TYPES, EXPERIMENT_TYPE_PROPERTY_TYPES and\\012-- SAMPLE_TYPE_PROPERTY_TYPES (AVCON_%)\\012-- 5. Added the ON DELETE CASCADE qualifier to the foreign keys MAPR_MTPT_FK,\\012-- EXPR_ETPT_FK and SAPR_STPT_FK\\012-- 6. Add the check constraint directly on the domain BOOLEAN_CHAR_OR_UNKNOWN\\012-- CREATE DOMAIN BOOLEAN_CHAR_OR_UNKNOWN AS CHAR(1) CHECK (VALUE in ('F', 'T', 'U')) DEFAULT 'U';\\012-- 7. Add the WITH TIMEZONE qualifier to the domain TIME_STAMP\\012-- CREATE DOMAIN TIME_STAMP AS TIMESTAMP WITH TIME ZONE;\\012-- 8. Add the WITH TIMEZONE and NOT NULL qualifiers to the domain TIME_STAMP_DFL\\012-- CREATE DOMAIN TIME_STAMP_DFL AS TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012-- 9. Extend the domain EVENT_TYPE by adding the CHECK constraint\\012-- CREATE DOMAIN EVENT_TYPE AS VARCHAR(40) CHECK (VALUE in ('DELETION', 'INVALIDATION', 'MOVEMENT'));\\012-- 10. Extend the domain AUTHORIZATION_ROLE by adding the CHECK constraint\\012-- CREATE DOMAIN AUTHORIZATION_ROLE as VARCHAR(40) CHECK (VALUE IN ('ADMIN', 'POWER_USER', 'USER', 'OBSERVER', 'ETL_SERVER'));\\012-- 11. Added the Sequence and Index sections\\012-- 12. Added DATABASE_INSTANCES.GLOBAL_CODE column for UUID\\012-- 13. DATABASE_INSTANCES.GLOBAL_CODE renamed to DATABASE_INSTANCES.UUID\\012-- 14. OBSERVABLE_TYPES renamed to DATA_SET_TYPES\\012-- 15. OBSERVABLE_TYPE_ID_SEQ renamed to DATA_SET_TYPE_ID_SEQ\\012-- 16. DATA.OBTY_ID renamed to DATA.DSTY_ID;\\012-- 17. some others - the source model should be updated to make these Post-Generation Modifications minimal \\012------------------------------------------------------------------------------------\\012\\012-- Creating tables\\012\\012CREATE TABLE CONTROLLED_VOCABULARIES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_CHOSEN_FROM_LIST BOOLEAN_CHAR NOT NULL DEFAULT TRUE, SOURCE_URI CHARACTER VARYING(250));\\012CREATE TABLE CONTROLLED_VOCABULARY_TERMS (ID TECH_ID NOT NULL,CODE OBJECT_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,COVO_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,LABEL COLUMN_LABEL, DESCRIPTION DESCRIPTION_2000, ORDINAL ORDINAL_INT NOT NULL);\\012CREATE TABLE DATA (ID TECH_ID NOT NULL,CODE CODE,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,IS_PLACEHOLDER BOOLEAN_CHAR DEFAULT 'F',IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL);\\012CREATE TABLE DATABASE_INSTANCES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,UUID CODE NOT NULL,IS_ORIGINAL_SOURCE BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE DATA_SET_RELATIONSHIPS (DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL);\\012CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REMOTE_URL VARCHAR(250) NOT NULL,SESSION_TOKEN VARCHAR(50) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_ARCHIVER_CONFIGURED BOOLEAN_CHAR NOT NULL DEFAULT 'F');\\012CREATE TABLE DATA_STORE_SERVICES (ID TECH_ID NOT NULL, KEY VARCHAR(256) NOT NULL, LABEL VARCHAR(256) NOT NULL, KIND DATA_STORE_SERVICE_KIND NOT NULL, DATA_STORE_ID TECH_ID NOT NULL);\\012CREATE TABLE DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID TECH_ID NOT NULL, DATA_SET_TYPE_ID TECH_ID NOT NULL);\\012CREATE TABLE DATA_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 NOT NULL);\\012CREATE TABLE EVENTS (ID TECH_ID NOT NULL,EVENT_TYPE EVENT_TYPE NOT NULL,DESCRIPTION DESCRIPTION_2000,REASON DESCRIPTION_2000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, entity_type VARCHAR(80) NOT NULL, identifier VARCHAR(250) NOT NULL);\\012CREATE TABLE EXPERIMENTS (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,EXTY_ID TECH_ID NOT NULL,MATE_ID_STUDY_OBJECT TECH_ID,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PROJ_ID TECH_ID NOT NULL,INVA_ID TECH_ID,IS_PUBLIC BOOLEAN_CHAR NOT NULL DEFAULT 'F');\\012CREATE TABLE ATTACHMENTS (ID TECH_ID NOT NULL,EXPE_ID TECH_ID,SAMP_ID TECH_ID,PROJ_ID TECH_ID,EXAC_ID TECH_ID NOT NULL,FILE_NAME FILE_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,VERSION INTEGER NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL, title TITLE_100, description DESCRIPTION_2000);\\012CREATE TABLE ATTACHMENT_CONTENTS (ID TECH_ID NOT NULL,VALUE FILE NOT NULL);\\012CREATE TABLE EXPERIMENT_PROPERTIES (ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,ETPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE EXPERIMENT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000);\\012CREATE TABLE EXTERNAL_DATA (DATA_ID TECH_ID NOT NULL,LOCATION VARCHAR(1024) NOT NULL,FFTY_ID TECH_ID NOT NULL,LOTY_ID TECH_ID NOT NULL,CVTE_ID_STOR_FMT TECH_ID NOT NULL,IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U',CVTE_ID_STORE TECH_ID, STATUS ARCHIVING_STATUS NOT NULL DEFAULT 'AVAILABLE');\\012CREATE TABLE FILE_FORMAT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL);\\012CREATE TABLE GRID_CUSTOM_COLUMNS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE VARCHAR(200) NOT NULL, LABEL column_label NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION GRID_EXPRESSION NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID GRID_ID NOT NULL);\\012CREATE TABLE GROUPS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DBIN_ID TECH_ID NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL);\\012CREATE TABLE INVALIDATIONS (ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,REASON DESCRIPTION_2000);\\012CREATE TABLE LOCATOR_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000);\\012CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,MATY_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, DBIN_ID TECH_ID NOT NULL);\\012CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,MTPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID);\\012CREATE TABLE MATERIAL_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE MATERIAL_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,MATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000);\\012CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000));\\012CREATE TABLE PERSONS (ID TECH_ID NOT NULL,FIRST_NAME VARCHAR(30),LAST_NAME VARCHAR(30),USER_ID USER_ID NOT NULL,EMAIL OBJECT_NAME,DBIN_ID TECH_ID NOT NULL,GROU_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID, DISPLAY_SETTINGS FILE);\\012CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,GROU_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION DESCRIPTION_2000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE PROPERTY_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 NOT NULL,LABEL COLUMN_LABEL NOT NULL,DATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,COVO_ID TECH_ID,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL, MATY_PROP_ID TECH_ID);\\012CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE NOT NULL,GROU_ID TECH_ID,DBIN_ID TECH_ID,PERS_ID_GRANTEE TECH_ID, AG_ID_GRANTEE TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE SAMPLES (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,EXPE_ID TECH_ID,SAMP_ID_TOP TECH_ID,SAMP_ID_GENERATED_FROM TECH_ID,SATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,INVA_ID TECH_ID,SAMP_ID_CONTROL_LAYOUT TECH_ID,DBIN_ID TECH_ID,GROU_ID TECH_ID,SAMP_ID_PART_OF TECH_ID);\\012CREATE TABLE SAMPLE_PROPERTIES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,STPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,CVTE_ID TECH_ID,MATE_PROP_ID TECH_ID,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T', GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0, PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, is_auto_generated_code BOOLEAN_CHAR NOT NULL DEFAULT 'F', generated_code_prefix CODE NOT NULL DEFAULT 'S');\\012CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T', ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000);\\012\\012CREATE TABLE DATA_SET_PROPERTIES (ID TECH_ID NOT NULL,DS_ID TECH_ID NOT NULL,DSTPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE DATA_SET_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000);\\012\\012CREATE TABLE AUTHORIZATION_GROUPS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE CODE NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE AUTHORIZATION_GROUP_PERSONS (AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL);\\012\\012CREATE TABLE FILTERS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION VARCHAR(2000) NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID VARCHAR(200) NOT NULL);\\012CREATE TABLE QUERIES (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION VARCHAR(2000) NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, QUERY_TYPE QUERY_TYPE NOT NULL, DB_KEY CODE NOT NULL DEFAULT '1');\\012\\012-- Creating sequences\\012\\012CREATE SEQUENCE CONTROLLED_VOCABULARY_ID_SEQ;\\012CREATE SEQUENCE CVTE_ID_SEQ;\\012CREATE SEQUENCE DATABASE_INSTANCE_ID_SEQ;\\012CREATE SEQUENCE DATA_ID_SEQ;\\012CREATE SEQUENCE DATA_SET_RELATIONSHIP_ID_SEQ;\\012CREATE SEQUENCE DATA_STORE_ID_SEQ;\\012CREATE SEQUENCE DATA_STORE_SERVICES_ID_SEQ;\\012CREATE SEQUENCE DATA_TYPE_ID_SEQ;\\012CREATE SEQUENCE ETPT_ID_SEQ;\\012CREATE SEQUENCE EVENT_ID_SEQ;\\012CREATE SEQUENCE ATTACHMENT_ID_SEQ;\\012CREATE SEQUENCE ATTACHMENT_CONTENT_ID_SEQ;\\012CREATE SEQUENCE EXPERIMENT_ID_SEQ;\\012CREATE SEQUENCE EXPERIMENT_PROPERTY_ID_SEQ;\\012CREATE SEQUENCE EXPERIMENT_TYPE_ID_SEQ;\\012CREATE SEQUENCE FILE_FORMAT_TYPE_ID_SEQ;\\012CREATE SEQUENCE GROUP_ID_SEQ;\\012CREATE SEQUENCE INVALIDATION_ID_SEQ;\\012CREATE SEQUENCE LOCATOR_TYPE_ID_SEQ;\\012CREATE SEQUENCE MATERIAL_ID_SEQ;\\012CREATE SEQUENCE MATERIAL_PROPERTY_ID_SEQ;\\012CREATE SEQUENCE MATERIAL_TYPE_ID_SEQ;\\012CREATE SEQUENCE MTPT_ID_SEQ;\\012CREATE SEQUENCE DATA_SET_TYPE_ID_SEQ;\\012CREATE SEQUENCE PERSON_ID_SEQ;\\012CREATE SEQUENCE PROJECT_ID_SEQ;\\012CREATE SEQUENCE PROPERTY_TYPE_ID_SEQ;\\012CREATE SEQUENCE ROLE_ASSIGNMENT_ID_SEQ;\\012CREATE SEQUENCE SAMPLE_ID_SEQ;\\012CREATE SEQUENCE SAMPLE_PROPERTY_ID_SEQ;\\012CREATE SEQUENCE SAMPLE_TYPE_ID_SEQ;\\012CREATE SEQUENCE STPT_ID_SEQ;\\012CREATE SEQUENCE DATA_SET_PROPERTY_ID_SEQ;\\012CREATE SEQUENCE DSTPT_ID_SEQ;\\012CREATE SEQUENCE CODE_SEQ;\\012CREATE SEQUENCE PERM_ID_SEQ;\\012CREATE SEQUENCE AUTHORIZATION_GROUP_ID_SEQ;\\012CREATE SEQUENCE FILTER_ID_SEQ;\\012CREATE SEQUENCE GRID_CUSTOM_COLUMNS_ID_SEQ;\\012CREATE SEQUENCE QUERY_ID_SEQ;\\012\\012-- Creating primary key constraints\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_PK PRIMARY KEY(ID);\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_PK PRIMARY KEY(ID);\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_TYPES ADD CONSTRAINT DATY_PK PRIMARY KEY(ID);\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PK PRIMARY KEY(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PK PRIMARY KEY(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PK PRIMARY KEY(ID);\\012ALTER TABLE ATTACHMENT_CONTENTS ADD CONSTRAINT EXAC_PK PRIMARY KEY(ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_PK PRIMARY KEY(ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_PK PRIMARY KEY(ID);\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PK PRIMARY KEY(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_PK PRIMARY KEY(DATA_ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_PK PRIMARY KEY(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PK PRIMARY KEY(ID);\\012ALTER TABLE INVALIDATIONS ADD CONSTRAINT INVA_PK PRIMARY KEY(ID);\\012ALTER TABLE LOCATOR_TYPES ADD CONSTRAINT LOTY_PK PRIMARY KEY(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PK PRIMARY KEY(ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_PK PRIMARY KEY(ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_PK PRIMARY KEY(ID);\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_PK PRIMARY KEY(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_PK PRIMARY KEY(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PK PRIMARY KEY(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_PK PRIMARY KEY(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PK PRIMARY KEY(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_PK PRIMARY KEY(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_PK PRIMARY KEY(ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_PK PRIMARY KEY(ID);\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PK PRIMARY KEY(PERS_ID,AG_ID);\\012ALTER TABLE FILTERS ADD CONSTRAINT FILT_PK PRIMARY KEY(ID);\\012ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_PK PRIMARY KEY(ID);\\012ALTER TABLE QUERIES ADD CONSTRAINT QUER_PK PRIMARY KEY(ID);\\012\\012-- Creating unique constraints\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_BK_UK UNIQUE(CODE,COVO_ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_BK_UK UNIQUE(CODE);\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_BK_UK UNIQUE(CODE);\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_UUID_UK UNIQUE(UUID);\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_BK_UK UNIQUE(DATA_ID_CHILD,DATA_ID_PARENT);\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_BK_UK UNIQUE(KEY, DATA_STORE_ID);\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_BK_UK UNIQUE(DATA_STORE_SERVICE_ID, DATA_SET_TYPE_ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE DATA_TYPES ADD CONSTRAINT DATY_BK_UK UNIQUE(CODE);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_BK_UK UNIQUE(CODE,PROJ_ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PI_UK UNIQUE(PERM_ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_BK_UK UNIQUE(EXPE_ID,ETPT_ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_BK_UK UNIQUE(EXTY_ID,PRTY_ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_BK_UK UNIQUE(LOCATION,LOTY_ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE LOCATOR_TYPES ADD CONSTRAINT LOTY_BK_UK UNIQUE(CODE);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_BK_UK UNIQUE(CODE,MATY_ID,DBIN_ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_BK_UK UNIQUE(MATE_ID,MTPT_ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_BK_UK UNIQUE(MATY_ID,PRTY_ID);\\012ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_BK_UK UNIQUE(DBIN_ID,USER_ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_BK_UK UNIQUE(CODE,GROU_ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PE_GROUP_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PE_INSTANCE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,DBIN_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_GROUP_BK_UK UNIQUE(AG_ID_GRANTEE,ROLE_CODE,GROU_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_INSTANCE_BK_UK UNIQUE(AG_ID_GRANTEE,ROLE_CODE,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_PI_UK UNIQUE(PERM_ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_BK_UK UNIQUE(SAMP_ID,STPT_ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_BK_UK UNIQUE(SATY_ID,PRTY_ID);\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_BK_UK UNIQUE(DSTY_ID,PRTY_ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_BK_UK UNIQUE(DS_ID,DSTPT_ID);\\012-- NOTE: following uniqueness constraints for attachments work, because (null != null) in Postgres \\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_EXPE_BK_UK UNIQUE(EXPE_ID,FILE_NAME,VERSION);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PROJ_BK_UK UNIQUE(PROJ_ID,FILE_NAME,VERSION);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_SAMP_BK_UK UNIQUE(SAMP_ID,FILE_NAME,VERSION);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE FILTERS ADD CONSTRAINT FILT_BK_UK UNIQUE(NAME, DBIN_ID, GRID_ID);\\012ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_BK_UK UNIQUE(CODE, DBIN_ID, GRID_ID);\\012ALTER TABLE QUERIES ADD CONSTRAINT QUER_BK_UK UNIQUE(NAME, DBIN_ID);\\012\\012-- Creating foreign key constraints\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_COVO_FK FOREIGN KEY (COVO_ID) REFERENCES CONTROLLED_VOCABULARIES(ID);\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_DSTY_FK FOREIGN KEY (DSTY_ID) REFERENCES DATA_SET_TYPES(ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS(ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES(ID);\\012ALTER TABLE DATA ADD CONSTRAINT DATA_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_CHILD FOREIGN KEY (DATA_ID_CHILD) REFERENCES DATA(ID);\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_PARENT FOREIGN KEY (DATA_ID_PARENT) REFERENCES DATA(ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_DS_FK FOREIGN KEY (DATA_STORE_ID) REFERENCES DATA_STORES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DS_FK FOREIGN KEY (DATA_STORE_SERVICE_ID) REFERENCES DATA_STORE_SERVICES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DST_FK FOREIGN KEY (DATA_SET_TYPE_ID) REFERENCES DATA_SET_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_EXTY_FK FOREIGN KEY (EXTY_ID) REFERENCES EXPERIMENT_TYPES(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_INVA_FK FOREIGN KEY (INVA_ID) REFERENCES INVALIDATIONS(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_MATE_FK FOREIGN KEY (MATE_ID_STUDY_OBJECT) REFERENCES MATERIALS(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PROJ_FK FOREIGN KEY (PROJ_ID) REFERENCES PROJECTS(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PROJ_FK FOREIGN KEY (PROJ_ID) REFERENCES PROJECTS(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_CONT_FK FOREIGN KEY (EXAC_ID) REFERENCES ATTACHMENT_CONTENTS(ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_ETPT_FK FOREIGN KEY (ETPT_ID) REFERENCES EXPERIMENT_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS(ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_EXTY_FK FOREIGN KEY (EXTY_ID) REFERENCES EXPERIMENT_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_FK FOREIGN KEY (CVTE_ID_STOR_FMT) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_STORED_ON_FK FOREIGN KEY (CVTE_ID_STORE) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_DATA_FK FOREIGN KEY (DATA_ID) REFERENCES DATA(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_FFTY_FK FOREIGN KEY (FFTY_ID) REFERENCES FILE_FORMAT_TYPES(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_LOTY_FK FOREIGN KEY (LOTY_ID) REFERENCES LOCATOR_TYPES(ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE INVALIDATIONS ADD CONSTRAINT INVA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_MATY_FK FOREIGN KEY (MATY_ID) REFERENCES MATERIAL_TYPES(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MATE_FK FOREIGN KEY (MATE_ID) REFERENCES MATERIALS(ID);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MTPT_FK FOREIGN KEY (MTPT_ID) REFERENCES MATERIAL_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_MATY_FK FOREIGN KEY (MATY_ID) REFERENCES MATERIAL_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_COVO_FK FOREIGN KEY (COVO_ID) REFERENCES CONTROLLED_VOCABULARIES(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DATY_FK FOREIGN KEY (DATY_ID) REFERENCES DATA_TYPES(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_MATY_FK FOREIGN KEY (MATY_PROP_ID) REFERENCES MATERIAL_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_GRANTEE FOREIGN KEY (PERS_ID_GRANTEE) REFERENCES PERSONS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_FK_GRANTEE FOREIGN KEY (AG_ID_GRANTEE) REFERENCES AUTHORIZATION_GROUPS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_INVA_FK FOREIGN KEY (INVA_ID) REFERENCES INVALIDATIONS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_CONTROL_LAYOUT FOREIGN KEY (SAMP_ID_CONTROL_LAYOUT) REFERENCES SAMPLES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_GENERATED_FROM FOREIGN KEY (SAMP_ID_GENERATED_FROM) REFERENCES SAMPLES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_PART_OF FOREIGN KEY (SAMP_ID_PART_OF) REFERENCES SAMPLES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_TOP FOREIGN KEY (SAMP_ID_TOP) REFERENCES SAMPLES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SATY_FK FOREIGN KEY (SATY_ID) REFERENCES SAMPLE_TYPES(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES(ID);\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_STPT_FK FOREIGN KEY (STPT_ID) REFERENCES SAMPLE_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_SATY_FK FOREIGN KEY (SATY_ID) REFERENCES SAMPLE_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_DSTY_FK FOREIGN KEY (DSTY_ID) REFERENCES DATA_SET_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DSTPT_FK FOREIGN KEY (DSTPT_ID) REFERENCES DATA_SET_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DS_FK FOREIGN KEY (DS_ID) REFERENCES DATA(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_AG_FK FOREIGN KEY (AG_ID) REFERENCES AUTHORIZATION_GROUPS(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PERS_FK FOREIGN KEY (PERS_ID) REFERENCES PERSONS(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012\\012ALTER TABLE FILTERS ADD CONSTRAINT FILT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE FILTERS ADD CONSTRAINT FILT_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE QUERIES ADD CONSTRAINT QUER_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE QUERIES ADD CONSTRAINT QUER_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012\\012-- Creating check constraints\\012\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_PERS_ARC_CK CHECK ((AG_ID_GRANTEE IS NOT NULL AND PERS_ID_GRANTEE IS NULL) OR (AG_ID_GRANTEE IS NULL AND PERS_ID_GRANTEE IS NOT NULL));\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_ARC_CK CHECK \\012\\011((EXPE_ID IS NOT NULL AND PROJ_ID IS NULL AND SAMP_ID IS NULL) OR \\012\\011 (EXPE_ID IS NULL AND PROJ_ID IS NOT NULL AND SAMP_ID IS NULL) OR\\012\\011 (EXPE_ID IS NULL AND PROJ_ID IS NULL AND SAMP_ID IS NOT NULL)\\012\\011);\\012ALTER TABLE events ADD CONSTRAINT evnt_et_enum_ck CHECK \\012\\011(entity_type IN ('ATTACHMENT', 'DATASET', 'EXPERIMENT', 'GROUP', 'MATERIAL', 'PROJECT', 'PROPERTY_TYPE', 'SAMPLE', 'VOCABULARY', 'AUTHORIZATION_GROUP')); \\012ALTER TABLE controlled_vocabulary_terms ADD CONSTRAINT cvte_ck CHECK (ordinal > 0);\\012\\012-- Creating indices\\012\\012CREATE INDEX COVO_PERS_FK_I ON CONTROLLED_VOCABULARIES (PERS_ID_REGISTERER);\\012CREATE INDEX CVTE_COVO_FK_I ON CONTROLLED_VOCABULARY_TERMS (COVO_ID);\\012CREATE INDEX CVTE_PERS_FK_I ON CONTROLLED_VOCABULARY_TERMS (PERS_ID_REGISTERER);\\012CREATE INDEX DATA_DSTY_FK_I ON DATA (DSTY_ID);\\012CREATE INDEX DATA_SAMP_FK_I ON DATA (SAMP_ID);\\012CREATE INDEX DATA_EXPE_FK_I ON DATA (EXPE_ID);\\012CREATE INDEX DAST_DBIN_FK_I ON DATA_STORES (DBIN_ID);\\012CREATE INDEX DSRE_DATA_FK_I_CHILD ON DATA_SET_RELATIONSHIPS (DATA_ID_CHILD);\\012CREATE INDEX DSRE_DATA_FK_I_PARENT ON DATA_SET_RELATIONSHIPS (DATA_ID_PARENT);\\012CREATE INDEX DSSE_DS_FK_I ON DATA_STORE_SERVICES (DATA_STORE_ID);\\012CREATE INDEX DSSDST_DS_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID);\\012CREATE INDEX DSSDST_DST_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_SET_TYPE_ID);\\012CREATE INDEX ETPT_EXTY_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (EXTY_ID);\\012CREATE INDEX ETPT_PERS_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX ETPT_PRTY_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (PRTY_ID);\\012CREATE INDEX EVNT_PERS_FK_I ON EVENTS (PERS_ID_REGISTERER);\\012CREATE INDEX ATTA_EXPE_FK_I ON ATTACHMENTS (EXPE_ID);\\012CREATE INDEX ATTA_SAMP_FK_I ON ATTACHMENTS (SAMP_ID);\\012CREATE INDEX ATTA_PROJ_FK_I ON ATTACHMENTS (PROJ_ID);\\012CREATE INDEX ATTA_PERS_FK_I ON ATTACHMENTS (PERS_ID_REGISTERER);\\012CREATE INDEX ATTA_EXAC_FK_I ON ATTACHMENTS (EXAC_ID);\\012CREATE INDEX EXDA_CVTE_FK_I ON EXTERNAL_DATA (CVTE_ID_STOR_FMT);\\012CREATE INDEX EXDA_CVTE_STORED_ON_FK_I ON EXTERNAL_DATA (CVTE_ID_STORE);\\012CREATE INDEX EXDA_FFTY_FK_I ON EXTERNAL_DATA (FFTY_ID);\\012CREATE INDEX EXDA_LOTY_FK_I ON EXTERNAL_DATA (LOTY_ID);\\012CREATE INDEX EXPE_EXTY_FK_I ON EXPERIMENTS (EXTY_ID);\\012CREATE INDEX EXPE_INVA_FK_I ON EXPERIMENTS (INVA_ID);\\012CREATE INDEX EXPE_MATE_FK_I ON EXPERIMENTS (MATE_ID_STUDY_OBJECT);\\012CREATE INDEX EXPE_PERS_FK_I ON EXPERIMENTS (PERS_ID_REGISTERER);\\012CREATE INDEX EXPE_PROJ_FK_I ON EXPERIMENTS (PROJ_ID);\\012CREATE INDEX EXPR_CVTE_FK_I ON EXPERIMENT_PROPERTIES (CVTE_ID);\\012CREATE INDEX EXPR_ETPT_FK_I ON EXPERIMENT_PROPERTIES (ETPT_ID);\\012CREATE INDEX EXPR_EXPE_FK_I ON EXPERIMENT_PROPERTIES (EXPE_ID);\\012CREATE INDEX EXPR_PERS_FK_I ON EXPERIMENT_PROPERTIES (PERS_ID_REGISTERER);\\012CREATE INDEX GROU_DBIN_FK_I ON GROUPS (DBIN_ID);\\012CREATE INDEX GROU_PERS_REGISTERED_BY_FK_I ON GROUPS (PERS_ID_REGISTERER);\\012CREATE INDEX INVA_PERS_FK_I ON INVALIDATIONS (PERS_ID_REGISTERER);\\012CREATE INDEX MAPR_CVTE_FK_I ON MATERIAL_PROPERTIES (CVTE_ID);\\012CREATE INDEX MAPR_MATE_FK_I ON MATERIAL_PROPERTIES (MATE_ID);\\012CREATE INDEX MAPR_MTPT_FK_I ON MATERIAL_PROPERTIES (MTPT_ID);\\012CREATE INDEX MAPR_PERS_FK_I ON MATERIAL_PROPERTIES (PERS_ID_REGISTERER);\\012CREATE INDEX MATE_MATY_FK_I ON MATERIALS (MATY_ID);\\012CREATE INDEX MATE_PERS_FK_I ON MATERIALS (PERS_ID_REGISTERER);\\012CREATE INDEX MTPT_MATY_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (MATY_ID);\\012CREATE INDEX MTPT_PERS_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX MTPT_PRTY_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (PRTY_ID);\\012CREATE INDEX PERS_GROU_FK_I ON PERSONS (GROU_ID);\\012CREATE INDEX PROJ_GROU_FK_I ON PROJECTS (GROU_ID);\\012CREATE INDEX PROJ_PERS_FK_I_LEADER ON PROJECTS (PERS_ID_LEADER);\\012CREATE INDEX PROJ_PERS_FK_I_REGISTERER ON PROJECTS (PERS_ID_REGISTERER);\\012CREATE INDEX PRTY_COVO_FK_I ON PROPERTY_TYPES (COVO_ID);\\012CREATE INDEX PRTY_DATY_FK_I ON PROPERTY_TYPES (DATY_ID);\\012CREATE INDEX PRTY_PERS_FK_I ON PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX ROAS_DBIN_FK_I ON ROLE_ASSIGNMENTS (DBIN_ID);\\012CREATE INDEX ROAS_GROU_FK_I ON ROLE_ASSIGNMENTS (GROU_ID);\\012CREATE INDEX ROAS_PERS_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (PERS_ID_GRANTEE);\\012CREATE INDEX ROAS_AG_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (AG_ID_GRANTEE);\\012CREATE INDEX ROAS_PERS_FK_I_REGISTERER ON ROLE_ASSIGNMENTS (PERS_ID_REGISTERER);\\012CREATE INDEX SAMP_INVA_FK_I ON SAMPLES (INVA_ID);\\012CREATE INDEX SAMP_PERS_FK_I ON SAMPLES (PERS_ID_REGISTERER);\\012CREATE INDEX SAMP_SAMP_FK_I_CONTROL_LAYOUT ON SAMPLES (SAMP_ID_CONTROL_LAYOUT);\\012CREATE INDEX SAMP_SAMP_FK_I_GENERATED_FROM ON SAMPLES (SAMP_ID_GENERATED_FROM);\\012CREATE INDEX SAMP_SAMP_FK_I_PART_OF ON SAMPLES (SAMP_ID_PART_OF);\\012CREATE INDEX SAMP_SAMP_FK_I_TOP ON SAMPLES (SAMP_ID_TOP);\\012CREATE INDEX SAMP_EXPE_FK_I ON SAMPLES (EXPE_ID);\\012CREATE INDEX SAMP_CODE_I ON SAMPLES (CODE);\\012CREATE INDEX SAMP_SATY_FK_I ON SAMPLES (SATY_ID);\\012CREATE INDEX SAPR_CVTE_FK_I ON SAMPLE_PROPERTIES (CVTE_ID);\\012CREATE INDEX SAPR_PERS_FK_I ON SAMPLE_PROPERTIES (PERS_ID_REGISTERER);\\012CREATE INDEX SAPR_SAMP_FK_I ON SAMPLE_PROPERTIES (SAMP_ID);\\012CREATE INDEX SAPR_STPT_FK_I ON SAMPLE_PROPERTIES (STPT_ID);\\012CREATE INDEX STPT_PERS_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX STPT_PRTY_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (PRTY_ID);\\012CREATE INDEX STPT_SATY_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (SATY_ID);\\012CREATE INDEX DSPR_CVTE_FK_I ON DATA_SET_PROPERTIES (CVTE_ID);\\012CREATE INDEX DSPR_DSTPT_FK_I ON DATA_SET_PROPERTIES (DSTPT_ID);\\012CREATE INDEX DSPR_DS_FK_I ON DATA_SET_PROPERTIES (DS_ID);\\012CREATE INDEX DSPR_PERS_FK_I ON DATA_SET_PROPERTIES (PERS_ID_REGISTERER);\\012CREATE INDEX DSTPT_DSTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (DSTY_ID);\\012CREATE INDEX DSTPT_PERS_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX DSTPT_PRTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PRTY_ID);\\012CREATE INDEX FILT_PERS_FK_I ON FILTERS (PERS_ID_REGISTERER);\\012CREATE INDEX FILT_DBIN_FK_I ON FILTERS (DBIN_ID);\\012CREATE INDEX GRID_CUSTOM_COLUMNS_PERS_FK_I ON GRID_CUSTOM_COLUMNS (PERS_ID_REGISTERER);\\012CREATE INDEX GRID_CUSTOM_COLUMNS_DBIN_FK_I ON GRID_CUSTOM_COLUMNS (DBIN_ID);\\012 \N -052 ./source//sql/postgresql/052/function-052.sql SUCCESS 2010-05-26 13:38:36.559 -- Creating Functions\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create function RENAME_SEQUENCE() that is required for renaming the sequences belonging to tables\\012------------------------------------------------------------------------------------\\012CREATE FUNCTION RENAME_SEQUENCE(OLD_NAME VARCHAR, NEW_NAME VARCHAR) RETURNS INTEGER AS $$\\012DECLARE\\012 CURR_SEQ_VAL INTEGER;\\012BEGIN\\012 SELECT INTO CURR_SEQ_VAL NEXTVAL(OLD_NAME);\\012 EXECUTE 'CREATE SEQUENCE ' || NEW_NAME || ' START WITH ' || CURR_SEQ_VAL;\\012 EXECUTE 'DROP SEQUENCE ' || OLD_NAME;\\012 RETURN CURR_SEQ_VAL;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger CONTROLLED_VOCABULARY_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION CONTROLLED_VOCABULARY_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_code CODE;\\012BEGIN\\012\\012 select code into v_code from data_types where id = NEW.daty_id;\\012\\012 -- Check if the data is of type "CONTROLLEDVOCABULARY"\\012 if v_code = 'CONTROLLEDVOCABULARY' then\\012 if NEW.covo_id IS NULL then\\012 RAISE EXCEPTION 'Insert/Update of Property Type (Code: %) failed, as its Data Type is CONTROLLEDVOCABULARY, but it is not linked to a Controlled Vocabulary.', NEW.code;\\012 end if;\\012 end if;\\012\\012 RETURN NEW;\\012\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER CONTROLLED_VOCABULARY_CHECK BEFORE INSERT OR UPDATE ON PROPERTY_TYPES\\012 FOR EACH ROW EXECUTE PROCEDURE CONTROLLED_VOCABULARY_CHECK();\\012\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger EXTERNAL_DATA_STORAGE_FORMAT_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION EXTERNAL_DATA_STORAGE_FORMAT_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_covo_code CODE;\\012 data_code CODE;\\012BEGIN\\012\\012 select code into v_covo_code from controlled_vocabularies\\012 where is_internal_namespace = true and \\012 id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt);\\012 -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT"\\012 if v_covo_code != 'STORAGE_FORMAT' then\\012 select code into data_code from data where id = NEW.data_id; \\012 RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', data_code, v_covo_code;\\012 end if;\\012\\012 RETURN NEW;\\012\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER EXTERNAL_DATA_STORAGE_FORMAT_CHECK BEFORE INSERT OR UPDATE ON EXTERNAL_DATA\\012 FOR EACH ROW EXECUTE PROCEDURE EXTERNAL_DATA_STORAGE_FORMAT_CHECK();\\012\\012 \\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger SAMPLE_CODE_UNIQUENESS_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012BEGIN\\012 LOCK TABLE samples IN EXCLUSIVE MODE;\\012\\011IF (NEW.samp_id_part_of is NULL) THEN\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 ELSE\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 END IF; \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER SAMPLE_CODE_UNIQUENESS_CHECK BEFORE INSERT OR UPDATE ON SAMPLES\\012 FOR EACH ROW EXECUTE PROCEDURE SAMPLE_CODE_UNIQUENESS_CHECK();\\012 \\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger MATERIAL/SAMPLE/EXPERIMENT/DATA_SET _PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK\\012-- It checks that if material property value is assigned to the entity,\\012--\\011\\011\\011\\011\\011\\011then the material type is equal to the one described by property type.\\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_type_id CODE;\\012 v_type_id_prop CODE;\\012BEGIN\\012 if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011 from material_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011 from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012 end if;\\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON material_properties\\012 FOR EACH ROW EXECUTE PROCEDURE MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012 \\012CREATE OR REPLACE FUNCTION SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_type_id CODE;\\012 v_type_id_prop CODE;\\012BEGIN\\012 if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011 from sample_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011 from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012 end if;\\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON sample_properties\\012 FOR EACH ROW EXECUTE PROCEDURE SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012 \\012CREATE OR REPLACE FUNCTION EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_type_id CODE;\\012 v_type_id_prop CODE;\\012BEGIN\\012 if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011 from experiment_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011 from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012 end if;\\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON experiment_properties\\012 FOR EACH ROW EXECUTE PROCEDURE EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012 \\012 -- data set\\012CREATE OR REPLACE FUNCTION DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_type_id CODE;\\012 v_type_id_prop CODE;\\012BEGIN\\012 if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011 from data_set_type_property_types dstpt, property_types pt \\012\\011\\011\\011 where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011 from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012 end if;\\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON data_set_properties\\012 FOR EACH ROW EXECUTE PROCEDURE DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK(); \\012 \\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Create DEFERRED triggers:\\012-- * check_dataset_relationships_on_data_table_modification,\\012-- * check_dataset_relationships_on_relationships_table_modification.\\012-- They check that after all modifications of database (just before commit) \\012-- if 'data'/'data_set_relationships' tables are among modified tables \\012-- dataset is not connected with a sample and a parent dataset at the same time.\\012-- This connections are held in two different tables so simple immediate trigger \\012-- with arc check cannot be used and we need two deferred triggers.\\012----------------------------------------------------------------------------------------------------\\012\\012-- trigger for 'data' table\\012\\012CREATE OR REPLACE FUNCTION check_dataset_relationships_on_data_table_modification() RETURNS trigger AS $$\\012DECLARE\\012\\011counter\\011INTEGER;\\012BEGIN\\012\\011-- if there is a connection with a Sample there should not be any connection with a parent Data Set\\012\\011IF (NEW.samp_id IS NOT NULL) THEN\\012\\011\\011-- count number of parents\\012\\011\\011SELECT count(*) INTO counter \\012\\011\\011\\011FROM data_set_relationships \\012\\011\\011\\011WHERE data_id_child = NEW.id;\\012\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected with a Sample and a parent Data Set at the same time.', NEW.code;\\012\\011\\011END IF;\\012\\011END IF;\\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_data_table_modification \\012 AFTER INSERT OR UPDATE ON data\\012\\011DEFERRABLE INITIALLY DEFERRED\\012\\011FOR EACH ROW \\012\\011EXECUTE PROCEDURE check_dataset_relationships_on_data_table_modification();\\012\\012-- trigger for 'data_set_relationships'\\012\\012CREATE OR REPLACE FUNCTION check_dataset_relationships_on_relationships_table_modification() RETURNS trigger AS $$\\012DECLARE\\012\\011counter\\011INTEGER;\\012\\011sample_id\\011TECH_ID;\\012\\011data_code\\011CODE;\\012BEGIN\\012\\011-- child will have a parent added so it should not be connected with any sample\\012\\011SELECT samp_id, code INTO sample_id, data_code \\012\\011\\011FROM data \\012\\011\\011WHERE id = NEW.data_id_child;\\012\\011IF (sample_id IS NOT NULL) THEN\\012\\011\\011RAISE EXCEPTION 'Insert/Update of Data Set (Code: %) failed because it cannot be connected to a Sample and to a parent Data Set at the same time.', data_code;\\012\\011END IF;\\012\\011RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012 \\012CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_relationships_table_modification \\012 AFTER INSERT OR UPDATE ON data_set_relationships\\012\\011DEFERRABLE INITIALLY DEFERRED\\012\\011FOR EACH ROW \\012\\011EXECUTE PROCEDURE check_dataset_relationships_on_relationships_table_modification();\\012 \N -052 ./source//sql/postgresql/052/grants-052.sql SUCCESS 2010-05-26 13:38:36.615 -- Granting SELECT privilege to group OPENBIS_READONLY\\012\\012GRANT SELECT ON SEQUENCE attachment_content_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE attachment_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE code_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE controlled_vocabulary_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE cvte_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_set_property_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_set_relationship_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_set_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_store_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE DATA_STORE_SERVICES_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE data_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE database_instance_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE dstpt_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE etpt_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE event_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE experiment_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE experiment_property_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE experiment_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE file_format_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE group_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE invalidation_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE locator_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE material_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE material_property_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE material_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE mtpt_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE perm_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE person_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE project_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE property_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE role_assignment_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE sample_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE sample_property_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE sample_type_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE stpt_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE authorization_group_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE filter_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE query_id_seq TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE attachment_contents TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE attachments TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE controlled_vocabularies TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE controlled_vocabulary_terms TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_set_properties TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_set_relationships TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_set_type_property_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_set_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_stores TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE data_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE DATA_STORE_SERVICES TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE DATA_STORE_SERVICE_DATA_SET_TYPES TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE database_instances TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE database_version_logs TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE events TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE experiment_properties TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE experiment_type_property_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE experiment_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE experiments TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE external_data TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE file_format_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE groups TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE invalidations TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE locator_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE material_properties TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE material_type_property_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE material_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE materials TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE persons TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE projects TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE property_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE role_assignments TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE sample_properties TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE sample_type_property_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE sample_types TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE samples TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE authorization_groups TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE authorization_group_persons TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE filters TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE queries TO GROUP OPENBIS_READONLY;\\012 \N -052 ./source//sql/generic/052/data-052.sql SUCCESS 2010-05-26 13:38:36.686 ----------------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table DATABASE_INSTANCES\\012----------------------------------------------------------------------------\\012\\012INSERT INTO database_instances(\\012 id\\012 , code\\012\\011 \\011, uuid\\012 , is_original_source)\\012 VALUES ( nextval('DATABASE_INSTANCE_ID_SEQ')\\012 , 'SYSTEM_DEFAULT'\\012\\011 \\011, 'SYSTEM_DEFAULT'\\012 , 'T');\\012\\012----------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table DATA_STORES\\012----------------------------------------------------------------------\\012\\012insert into data_stores\\012(id\\012,code\\012,download_url\\012,remote_url\\012,session_token\\012,dbin_id)\\012values\\012(nextval('DATA_STORE_ID_SEQ')\\012,'STANDARD'\\012,''\\012,''\\012,''\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012----------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table PERSONS\\012-----------------------------------------------------------------------\\012\\012insert into persons\\012(id\\012,first_name\\012,last_name\\012,user_id\\012,email\\012,dbin_id)\\012values\\012(nextval('PERSON_ID_SEQ')\\012,''\\012,'System User'\\012,'system'\\012,''\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT') );\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Create Controlled Vocabulary STORAGE_FORMAT\\012-----------------------------------------------------------------------------------\\012insert into controlled_vocabularies \\012 ( id\\012 , code\\012 , is_internal_namespace \\012 , description\\012 , pers_id_registerer\\012 , is_managed_internally\\012 , dbin_id)\\012values (nextval('CONTROLLED_VOCABULARY_ID_SEQ')\\012 , 'STORAGE_FORMAT'\\012 , true\\012 , 'The on-disk storage format of a data set'\\012 , (select id from persons where user_id ='system')\\012 , true\\012 , (select id from database_instances where code = 'SYSTEM_DEFAULT'));\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Create Controlled Vocabulary Terms for STORAGE_FORMAT\\012-----------------------------------------------------------------------------------\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer\\012 , ordinal )\\012values (nextval('CVTE_ID_SEQ')\\012 , 'PROPRIETARY'\\012 , (select id from controlled_vocabularies where code = 'STORAGE_FORMAT' and is_internal_namespace = true)\\012 , (select id from persons where user_id ='system')\\012 , 1);\\012\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer\\012 , ordinal)\\012values (nextval('CVTE_ID_SEQ')\\012 , 'BDS_DIRECTORY'\\012 , (select id from controlled_vocabularies where code = 'STORAGE_FORMAT' and is_internal_namespace = true)\\012 , (select id from persons where user_id ='system')\\012 , 2);\\012\\012------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table DATA_TYPES\\012------------------------------------------------------------------\\012\\012insert into data_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('DATA_TYPE_ID_SEQ')\\012,'VARCHAR'\\012,'Short text'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'MULTILINE_VARCHAR'\\012 ,'Long text'\\012);\\012\\012insert into data_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('DATA_TYPE_ID_SEQ')\\012,'INTEGER'\\012,'Integer number'\\012);\\012\\012insert into data_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('DATA_TYPE_ID_SEQ')\\012,'REAL'\\012,'Real number, i.e. an inexact, variable-precision numeric type'\\012);\\012\\012insert into data_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('DATA_TYPE_ID_SEQ')\\012,'BOOLEAN'\\012,'True or False'\\012);\\012\\012insert into data_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('DATA_TYPE_ID_SEQ')\\012,'TIMESTAMP'\\012,'Both date and time. Format: yyyy-mm-dd hh:mm:ss'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'CONTROLLEDVOCABULARY'\\012 ,'Controlled Vocabulary'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'MATERIAL'\\012 ,'Reference to a material'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'HYPERLINK'\\012 ,'Address of a web page'\\012);\\012\\012----------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table PROPERTY_TYPES\\012-----------------------------------------------------------------------\\012\\012insert into property_types\\012(id\\012,code\\012,description\\012,label\\012,daty_id\\012,pers_id_registerer\\012,dbin_id)\\012values \\012(nextval('PROPERTY_TYPE_ID_SEQ')\\012,'DESCRIPTION'\\012,'A Description'\\012,'Description'\\012,(select id from data_types where code ='VARCHAR')\\012,(select id from persons where user_id ='system')\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012--------------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table DATA_SET_TYPES\\012--------------------------------------------------------------------------\\012\\012insert into data_set_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('DATA_SET_TYPE_ID_SEQ')\\012,'UNKNOWN'\\012,'Unknown'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012-------------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table FILE_FORMAT_TYPES\\012-------------------------------------------------------------------------\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'HDF5'\\012,'Hierarchical Data Format File, version 5'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'PROPRIETARY'\\012,'Proprietary Format File'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'SRF'\\012,'Sequence Read Format File'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'TIFF'\\012,'TIFF File'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'TSV'\\012,'Tab Separated Values File'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012insert into file_format_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('FILE_FORMAT_TYPE_ID_SEQ')\\012,'XML'\\012,'XML File'\\012,(select id from database_instances where code = 'SYSTEM_DEFAULT')\\012);\\012\\012---------------------------------------------------------------------\\012-- Purpose: Insert an initial data set into the table LOCATOR_TYPES\\012---------------------------------------------------------------------\\012\\012insert into locator_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('LOCATOR_TYPE_ID_SEQ')\\012,'RELATIVE_LOCATION'\\012,'Relative Location'\\012);\\012 \N -\. - - --- --- Data for Name: events; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY events (id, event_type, description, reason, pers_id_registerer, registration_timestamp, entity_type, identifier) FROM stdin; -\. - - --- --- Data for Name: experiment_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_properties (id, expe_id, etpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: experiment_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_type_property_types (id, exty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, ordinal, section) FROM stdin; -\. - - --- --- Data for Name: experiment_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiment_types (id, code, description, dbin_id, modification_timestamp) FROM stdin; -1 PLASMID \N 1 2010-05-26 13:41:56.662019+02 -\. - - --- --- Data for Name: experiments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY experiments (id, perm_id, code, exty_id, mate_id_study_object, pers_id_registerer, registration_timestamp, modification_timestamp, proj_id, inva_id, is_public) FROM stdin; -\. - - --- --- Data for Name: external_data; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY external_data (data_id, location, ffty_id, loty_id, cvte_id_stor_fmt, is_complete, cvte_id_store, status) FROM stdin; -\. - - --- --- Data for Name: file_format_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY file_format_types (id, code, description, dbin_id) FROM stdin; -1 PROPRIETARY Proprietary File Format 1 -2 DIRECTORY 1 -3 GB 1 -4 FASTA 1 -5 XDNA 1 -6 AB1 1 -7 FA 1 -\. - - --- --- Data for Name: filters; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY filters (id, dbin_id, name, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, grid_id) FROM stdin; -\. - - --- --- Data for Name: grid_custom_columns; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY grid_custom_columns (id, dbin_id, code, label, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, grid_id) FROM stdin; -\. - - --- --- Data for Name: groups; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY groups (id, code, dbin_id, description, registration_timestamp, pers_id_registerer) FROM stdin; -\. - - --- --- Data for Name: invalidations; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY invalidations (id, pers_id_registerer, registration_timestamp, reason) FROM stdin; -\. - - --- --- Data for Name: locator_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY locator_types (id, code, description) FROM stdin; -1 RELATIVE_LOCATION Relative Location -\. - - --- --- Data for Name: material_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_properties (id, mate_id, mtpt_id, value, registration_timestamp, modification_timestamp, pers_id_registerer, cvte_id, mate_prop_id) FROM stdin; -\. - - --- --- Data for Name: material_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_type_property_types (id, maty_id, prty_id, is_mandatory, is_managed_internally, registration_timestamp, pers_id_registerer, ordinal, section) FROM stdin; -\. - - --- --- Data for Name: material_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY material_types (id, code, description, dbin_id, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: materials; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY materials (id, code, maty_id, pers_id_registerer, registration_timestamp, modification_timestamp, dbin_id) FROM stdin; -\. - - --- --- Data for Name: persons; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY persons (id, first_name, last_name, user_id, email, dbin_id, grou_id, registration_timestamp, pers_id_registerer, display_settings) FROM stdin; -1 System User system 1 \N 2010-05-26 13:38:36.62686+02 \N \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -2 ETL server etlserver piotr.buczek@bsse.ethz.ch 1 \N 2010-06-01 13:59:41.111995+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -3 Izabela Maria Adamczyk izabelaa izabela.adamczyk@bsse.ethz.ch 1 \N 2010-06-01 09:53:00.914766+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -4 Piotr Buczek buczekp piotr.buczek@bsse.ethz.ch 1 \N 2010-05-27 15:54:23.647329+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\007t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\000\\300\\001x -5 Franz-Josef Elmer felmer franz-josef.elmer@bsse.ethz.ch 1 \N 2010-06-01 10:00:46.008847+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -6 Tomasz Ryszard Pylak tpylak tomasz.pylak@bsse.ethz.ch 1 \N 2010-05-28 14:15:04.232136+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\007t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\000\\300\\001x -7 Chandrasekhar Ramakrishnan cramakri cramakri@inf.ethz.ch 1 \N 2010-06-01 10:00:46.008847+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -8 Bernd Rinn brinn bernd.rinn@bsse.ethz.ch 1 \N 2010-06-01 09:59:37.172417+02 1 \\254\\355\\000\\005sr\\000Ach.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\005Z\\000)displayCustomColumnDebuggingErrorMessagesZ\\000\\025useWildcardSearchModeL\\000\\016columnSettingst\\000\\017Ljava/util/Map;L\\000\\035realNumberFormatingParameterst\\000QLch/systemsx/cisd/openbis/generic/shared/basic/dto/RealNumberFormatingParameters;L\\000\\017sectionSettingsq\\000~\\000\\001xp\\000\\000sr\\000\\027java.util.LinkedHashMap4\\300N\\\\\\020l\\300\\373\\002\\000\\001Z\\000\\013accessOrderxr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\012t\\000\\027vocabulary-browser-gridsr\\000\\023java.util.ArrayListx\\201\\322\\035\\231\\307a\\235\\003\\000\\001I\\000\\004sizexp\\000\\000\\000\\007w\\004\\000\\000\\000\\012sr\\000?ch.systemsx.cisd.openbis.generic.shared.basic.dto.ColumnSetting\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\004Z\\000\\011hasFilterZ\\000\\006hiddenI\\000\\005widthL\\000\\010columnIDt\\000\\022Ljava/lang/String;xp\\001\\000\\000\\000\\000\\377t\\000\\004CODEsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\013DESCRIPTIONsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\025IS_MANAGED_INTERNALLYsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013REGISTRATORsq\\000~\\000\\012\\000\\000\\000\\000\\001,t\\000\\021REGISTRATION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\001,t\\000\\014URL_TEMPLATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020SHOW_IN_CHOOSERSxt\\000\\025vocabulary-terms-gridsq\\000~\\000\\010\\000\\000\\000\\014w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\355q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\005LABELsq\\000~\\000\\012\\000\\001\\000\\000\\001,q\\000~\\000\\017sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\007ORDINALsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\003URLsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013TOTAL_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020EXPERIMENT_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\014SAMPLE_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_SET_USAGEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016MATERIAL_USAGExt\\000%property-type-assignment-browser-gridsq\\000~\\000\\010\\000\\000\\000\\011w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\001\\000\\000\\000\\001\\024t\\000\\022PROPERTY_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310t\\000\\020ENTITY_TYPE_CODEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_KINDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014IS_MANDATORYsq\\000~\\000\\012\\000\\000\\000\\000\\001Mt\\000\\011DATA_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000dq\\000~\\000!sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\007SECTIONxt\\000\\032property-type-browser-gridsq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\036sq\\000~\\000\\012\\001\\000\\000\\000\\000\\370q\\000~\\000\\015sq\\000~\\000\\012\\001\\000\\000\\000\\000\\310q\\000~\\000=sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\016DATA_TYPE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012VOCABULARYsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\015MATERIAL_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\017sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\014SAMPLE_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\020EXPERIMENT_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016MATERIAL_TYPESsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\016DATA_SET_TYPESxt\\000 entity-browser-grid-SAMPLE-(all)sq\\000~\\000\\010\\000\\000\\000\\035w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021DATABASE_INSTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\005GROUPsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007SUBCODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\252t\\000\\021SAMPLE_IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\013SAMPLE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022IS_INSTANCE_SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\012IS_INVALIDsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\012EXPERIMENTsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\025EXPERIMENT_IDENTIFIERsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\007PROJECTsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\007PERM_IDsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\021SHOW_DETAILS_LINKsq\\000~\\000\\012\\000\\000\\000\\000\\000\\352t\\000\\023property-USER-OWNERsq\\000~\\000\\012\\000\\000\\000\\000\\000}t\\000\\032property-USER-OWNER_NUMBERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\357t\\000\\032property-USER-PLASMID_NAMEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\303t\\000-property-USER-BACTERIAL_ANTIBIOTIC_RESISTANCEsq\\000~\\000\\012\\000\\000\\000\\000\\0011t\\000\\026property-USER-BACKBONEsq\\000~\\000\\012\\000\\000\\000\\000\\000_t\\000\\033property-USER-DERIVATIVE_OFsq\\000~\\000\\012\\000\\000\\000\\000\\000\\177t\\000\\032property-USER-YEAST_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000at\\000\\032property-USER-OTHER_MARKERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\301t\\000*property-USER-FLANKING_RESTRICTION_ENZYMESsq\\000~\\000\\012\\000\\000\\000\\000\\001At\\000\\026property-USER-COMMENTSsq\\000~\\000\\012\\000\\000\\000\\000\\000+t\\000\\021property-USER-ROWsq\\000~\\000\\012\\000\\000\\000\\000\\000(t\\000\\021property-USER-BOXsq\\000~\\000\\012\\000\\000\\000\\000\\000@t\\000\\024property-USER-COLUMNsq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\026property-USER-BOX_SIZExt\\000\\022search-result-gridsq\\000~\\000\\010\\000\\000\\000\\006w\\004\\000\\000\\000\\012sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\0009sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226t\\000\\013ENTITY_TYPEsq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\012IDENTIFIERsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\001\\000\\000\\000\\000\\262t\\000\\016MATCHING_FIELDsq\\000~\\000\\012\\000\\000\\000\\000\\000\\310t\\000\\015MATCHING_TEXTxt\\000$sample-details-grid-DATA_SET-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\357q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dt\\000\\006SAMPLEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xt\\000\\017EXPERIMENT_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\001\\013q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013SOURCE_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\013IS_COMPLETEsq\\000~\\000\\012\\000\\000\\000\\000\\002\\032t\\000\\010LOCATIONsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\006STATUSsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\020FILE_FORMAT_TYPEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\015DATA_SET_TYPEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310t\\000\\017PRODUCTION_DATEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226t\\000\\022DATA_PRODUCER_CODEsq\\000~\\000\\012\\000\\000\\000\\000\\000\\226t\\000\\017DATA_STORE_CODEsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$entity-browser-grid-EXPERIMENT-(all)sq\\000~\\000\\010\\000\\000\\000\\013w\\004\\000\\000\\000\\020sq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\321q\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000$data-set-search-result-grid-DATA_SETsq\\000~\\000\\010\\000\\000\\000\\025w\\004\\000\\000\\000\\031sq\\000~\\000\\012\\001\\000\\000\\000\\000\\331q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000\\236sq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000_sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000dq\\000~\\000isq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\244sq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\310q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\251sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\253sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\255sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\257sq\\000~\\000\\012\\001\\001\\000\\000\\000\\226q\\000~\\000\\261sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\263sq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000\\265sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\267sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000\\271sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qxt\\000"entity-browser-grid-SAMPLE-PLASMIDsq\\000~\\000\\010\\000\\000\\000\\034w\\004\\000\\000\\000&sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Xsq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000Zsq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000\\015sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000]sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000_sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000asq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000csq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000esq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000gsq\\000~\\000\\012\\000\\001\\000\\000\\000\\310q\\000~\\000isq\\000~\\000\\012\\001\\000\\000\\000\\000\\226q\\000~\\000ksq\\000~\\000\\012\\000\\000\\000\\000\\000\\226q\\000~\\000\\023sq\\000~\\000\\012\\000\\000\\000\\000\\001,q\\000~\\000\\025sq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000osq\\000~\\000\\012\\000\\001\\000\\000\\000\\226q\\000~\\000qsq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ssq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000usq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000wsq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000{sq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000}sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000ysq\\000~\\000\\012\\001\\001\\000\\000\\000xq\\000~\\000\\177sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\201sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\203sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\205sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\211sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\207sq\\000~\\000\\012\\000\\001\\000\\000\\000xq\\000~\\000\\213xx\\000sr\\000Och.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters\\000\\000\\000\\000\\000\\000\\000\\001\\002\\000\\003Z\\000\\020formatingEnabledI\\000\\011precisionZ\\000\\012scientificxp\\001\\000\\000\\000\\004\\000sq\\000~\\000\\005?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000+sample-sectiongeneric-sample-viewer-PLASMIDsr\\000\\021java.lang.Boolean\\315 r\\200\\325\\234\\372\\356\\002\\000\\001Z\\000\\005valuexp\\000t\\000/attachment-sectiongeneric-sample-viewer-PLASMIDsq\\000~\\001\\002\\001x -\. - - --- --- Data for Name: projects; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY projects (id, code, grou_id, pers_id_leader, description, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY property_types (id, code, description, label, daty_id, registration_timestamp, pers_id_registerer, covo_id, is_managed_internally, is_internal_namespace, dbin_id, maty_prop_id) FROM stdin; -2 OWNER Owner Owner 7 2010-05-26 17:43:09.455462+02 1 2 f f 1 \N -3 OWNER_NUMBER Owner Number Owner Number 1 2010-05-26 17:44:12.71825+02 1 \N f f 1 \N -4 PLASMID_NAME Plasmid Name Plasmid Name 1 2010-05-26 17:44:49.704455+02 1 \N f f 1 \N -5 BACKBONE Backbone Backbone 7 2010-05-26 17:45:12.139095+02 1 3 f f 1 \N -6 BACTERIAL_ANTIBIOTIC_RESISTANCE Bacterial Antibiotic Resistance Bacterial Antibiotic Resistance 7 2010-05-26 17:46:13.565449+02 1 5 f f 1 \N -7 YEAST_MARKER (Yeast) Marker (Yeast) Marker 7 2010-05-26 17:46:45.413022+02 1 4 f f 1 \N -8 OTHER_MARKER Other Marker Other Marker 1 2010-05-26 17:47:27.064274+02 1 \N f f 1 \N -9 FLANKING_RESTRICTION_ENZYMES Flanking Restriction Enzymes Flanking Restriction Enzymes 1 2010-05-26 17:47:52.936812+02 1 \N f f 1 \N -10 COMMENTS Comments Comments 2 2010-05-26 17:48:11.007632+02 1 \N f f 1 \N -15 BOX_SIZE Box Size Box Size 7 2010-05-26 21:54:56.547721+02 1 6 f f 1 \N -13 COLUMN Column number in the Box Column 3 2010-05-26 18:38:35.546129+02 1 \N f f 1 \N -16 ROW Row letter in the Box Row 7 2010-05-27 17:58:56.942478+02 1 7 f f 1 \N -14 DERIVATIVE_OF Codes (separated by commas) of those Plasmids that the current Plasmid is a combination of. One of the Plasmid is the Parent. Derivative Of 1 2010-05-26 21:45:36.120436+02 1 \N f f 1 \N -17 FILE_NAME Name of the original file stored in DSS Original File Name 1 2010-05-30 12:55:28.819182+02 1 \N f f 1 \N -\. - - --- --- Data for Name: queries; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY queries (id, dbin_id, name, description, registration_timestamp, pers_id_registerer, modification_timestamp, expression, is_public, query_type, db_key) FROM stdin; -\. - - --- --- Data for Name: role_assignments; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY role_assignments (id, role_code, grou_id, dbin_id, pers_id_grantee, ag_id_grantee, pers_id_registerer, registration_timestamp) FROM stdin; -1 ADMIN \N 1 1 \N 1 2010-05-26 13:39:42.830149+02 -2 ETL_SERVER \N 1 2 \N 4 2010-06-01 14:00:28.560623+02 -4 ADMIN \N 1 \N 1 1 2010-05-31 21:14:11.261376+02 -\. - - --- --- Data for Name: sample_properties; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_properties (id, samp_id, stpt_id, value, cvte_id, mate_prop_id, pers_id_registerer, registration_timestamp, modification_timestamp) FROM stdin; -\. - - --- --- Data for Name: sample_type_property_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_type_property_types (id, saty_id, prty_id, is_mandatory, is_managed_internally, pers_id_registerer, registration_timestamp, is_displayed, ordinal, section) FROM stdin; -1 1 16 t f 1 2010-05-27 17:59:42.28433+02 t 1 Storage Information -2 1 13 t f 1 2010-05-26 19:08:07.246686+02 t 2 Storage Information -3 1 2 t f 1 2010-05-26 19:13:10.256579+02 t 3 Plasmid Data -4 1 3 f f 1 2010-05-26 19:11:49.533054+02 t 4 Plasmid Data -5 1 4 t f 1 2010-05-26 19:14:56.30574+02 t 5 Plasmid Data -6 1 5 t f 1 2010-05-26 18:39:38.450567+02 t 6 Plasmid Data -7 1 14 f f 1 2010-05-26 21:46:21.937645+02 t 7 Plasmid Data -8 1 6 t f 1 2010-05-26 19:06:55.50256+02 t 8 Plasmid Data -9 1 7 f f 1 2010-05-26 19:15:29.812545+02 t 9 Plasmid Data -10 1 8 f f 1 2010-05-26 19:10:09.014083+02 t 10 Plasmid Data -11 1 9 f f 1 2010-05-26 19:10:01.329441+02 t 11 Plasmid Data -12 1 10 f f 1 2010-05-26 19:09:07.086779+02 t 12 Plasmid Data -20 2 15 t f 1 2010-05-26 21:55:14.652494+02 t 1 \N -\. - - --- --- Data for Name: sample_types; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY sample_types (id, code, description, dbin_id, is_listable, generated_from_depth, part_of_depth, modification_timestamp, is_auto_generated_code, generated_code_prefix) FROM stdin; -2 PLASMID_BOX \N 1 t 0 0 2010-05-26 21:51:13.659151+02 f BOX_ -1 PLASMID \N 1 t 1 1 2010-05-26 13:43:50.663104+02 f FRP_ -\. - - --- --- Data for Name: samples; Type: TABLE DATA; Schema: public; Owner: - --- - -COPY samples (id, perm_id, code, expe_id, samp_id_top, samp_id_generated_from, saty_id, registration_timestamp, modification_timestamp, pers_id_registerer, inva_id, samp_id_control_layout, dbin_id, grou_id, samp_id_part_of) FROM stdin; -\. - - --- --- Name: ag_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: ag_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_pk PRIMARY KEY (id); - - --- --- Name: agp_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_pk PRIMARY KEY (pers_id, ag_id); - - --- --- Name: atta_expe_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_expe_bk_uk UNIQUE (expe_id, file_name, version); - - --- --- Name: atta_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_pk PRIMARY KEY (id); - - --- --- Name: atta_proj_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_proj_bk_uk UNIQUE (proj_id, file_name, version); - - --- --- Name: atta_samp_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_samp_bk_uk UNIQUE (samp_id, file_name, version); - - --- --- Name: covo_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_bk_uk UNIQUE (code, is_internal_namespace, dbin_id); - - --- --- Name: covo_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_pk PRIMARY KEY (id); - - --- --- Name: cvte_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_bk_uk UNIQUE (code, covo_id); - - --- --- Name: cvte_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_pk PRIMARY KEY (id); - - --- --- Name: dast_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: dast_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_pk PRIMARY KEY (id); - - --- --- Name: data_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_bk_uk UNIQUE (code); - - --- --- Name: data_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_pk PRIMARY KEY (id); - - --- --- Name: daty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_types - ADD CONSTRAINT daty_bk_uk UNIQUE (code); - - --- --- Name: daty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_types - ADD CONSTRAINT daty_pk PRIMARY KEY (id); - - --- --- Name: dbin_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_bk_uk UNIQUE (code); - - --- --- Name: dbin_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_pk PRIMARY KEY (id); - - --- --- Name: dbin_uuid_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY database_instances - ADD CONSTRAINT dbin_uuid_uk UNIQUE (uuid); - - --- --- Name: dspr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_bk_uk UNIQUE (ds_id, dstpt_id); - - --- --- Name: dspr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_pk PRIMARY KEY (id); - - --- --- Name: dsre_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_bk_uk UNIQUE (data_id_child, data_id_parent); - - --- --- Name: dssdst_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_bk_uk UNIQUE (data_store_service_id, data_set_type_id); - - --- --- Name: dsse_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_bk_uk UNIQUE (key, data_store_id); - - --- --- Name: dsse_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_pk PRIMARY KEY (id); - - --- --- Name: dstpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_bk_uk UNIQUE (dsty_id, prty_id); - - --- --- Name: dstpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_pk PRIMARY KEY (id); - - --- --- Name: dsty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: dsty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_pk PRIMARY KEY (id); - - --- --- Name: etpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_bk_uk UNIQUE (exty_id, prty_id); - - --- --- Name: etpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_pk PRIMARY KEY (id); - - --- --- Name: evnt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY events - ADD CONSTRAINT evnt_pk PRIMARY KEY (id); - - --- --- Name: exac_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY attachment_contents - ADD CONSTRAINT exac_pk PRIMARY KEY (id); - - --- --- Name: exda_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_bk_uk UNIQUE (location, loty_id); - - --- --- Name: exda_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_pk PRIMARY KEY (data_id); - - --- --- Name: expe_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_bk_uk UNIQUE (code, proj_id); - - --- --- Name: expe_pi_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pi_uk UNIQUE (perm_id); - - --- --- Name: expe_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pk PRIMARY KEY (id); - - --- --- Name: expr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_bk_uk UNIQUE (expe_id, etpt_id); - - --- --- Name: expr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_pk PRIMARY KEY (id); - - --- --- Name: exty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: exty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_pk PRIMARY KEY (id); - - --- --- Name: ffty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: ffty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_pk PRIMARY KEY (id); - - --- --- Name: filt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_bk_uk UNIQUE (name, dbin_id, grid_id); - - --- --- Name: filt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_pk PRIMARY KEY (id); - - --- --- Name: grid_custom_columns_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_bk_uk UNIQUE (code, dbin_id, grid_id); - - --- --- Name: grid_custom_columns_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_pk PRIMARY KEY (id); - - --- --- Name: grou_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: grou_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_pk PRIMARY KEY (id); - - --- --- Name: inva_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY invalidations - ADD CONSTRAINT inva_pk PRIMARY KEY (id); - - --- --- Name: loty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY locator_types - ADD CONSTRAINT loty_bk_uk UNIQUE (code); - - --- --- Name: loty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY locator_types - ADD CONSTRAINT loty_pk PRIMARY KEY (id); - - --- --- Name: mapr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_bk_uk UNIQUE (mate_id, mtpt_id); - - --- --- Name: mapr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_pk PRIMARY KEY (id); - - --- --- Name: mate_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_bk_uk UNIQUE (code, maty_id, dbin_id); - - --- --- Name: mate_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_pk PRIMARY KEY (id); - - --- --- Name: maty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: maty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_pk PRIMARY KEY (id); - - --- --- Name: mtpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_bk_uk UNIQUE (maty_id, prty_id); - - --- --- Name: mtpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_pk PRIMARY KEY (id); - - --- --- Name: pers_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_bk_uk UNIQUE (dbin_id, user_id); - - --- --- Name: pers_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_pk PRIMARY KEY (id); - - --- --- Name: proj_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_bk_uk UNIQUE (code, grou_id); - - --- --- Name: proj_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pk PRIMARY KEY (id); - - --- --- Name: prty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_bk_uk UNIQUE (code, is_internal_namespace, dbin_id); - - --- --- Name: prty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_pk PRIMARY KEY (id); - - --- --- Name: quer_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_bk_uk UNIQUE (name, dbin_id); - - --- --- Name: quer_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_pk PRIMARY KEY (id); - - --- --- Name: roas_ag_group_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_group_bk_uk UNIQUE (ag_id_grantee, role_code, grou_id); - - --- --- Name: roas_ag_instance_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_instance_bk_uk UNIQUE (ag_id_grantee, role_code, dbin_id); - - --- --- Name: roas_pe_group_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pe_group_bk_uk UNIQUE (pers_id_grantee, role_code, grou_id); - - --- --- Name: roas_pe_instance_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pe_instance_bk_uk UNIQUE (pers_id_grantee, role_code, dbin_id); - - --- --- Name: roas_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pk PRIMARY KEY (id); - - --- --- Name: samp_pi_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pi_uk UNIQUE (perm_id); - - --- --- Name: samp_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pk PRIMARY KEY (id); - - --- --- Name: sapr_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_bk_uk UNIQUE (samp_id, stpt_id); - - --- --- Name: sapr_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_pk PRIMARY KEY (id); - - --- --- Name: saty_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_bk_uk UNIQUE (code, dbin_id); - - --- --- Name: saty_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_pk PRIMARY KEY (id); - - --- --- Name: stpt_bk_uk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_bk_uk UNIQUE (saty_id, prty_id); - - --- --- Name: stpt_pk; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_pk PRIMARY KEY (id); - - --- --- Name: atta_exac_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_exac_fk_i ON attachments USING btree (exac_id); - - --- --- Name: atta_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_expe_fk_i ON attachments USING btree (expe_id); - - --- --- Name: atta_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_pers_fk_i ON attachments USING btree (pers_id_registerer); - - --- --- Name: atta_proj_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_proj_fk_i ON attachments USING btree (proj_id); - - --- --- Name: atta_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX atta_samp_fk_i ON attachments USING btree (samp_id); - - --- --- Name: covo_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX covo_pers_fk_i ON controlled_vocabularies USING btree (pers_id_registerer); - - --- --- Name: cvte_covo_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX cvte_covo_fk_i ON controlled_vocabulary_terms USING btree (covo_id); - - --- --- Name: cvte_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX cvte_pers_fk_i ON controlled_vocabulary_terms USING btree (pers_id_registerer); - - --- --- Name: dast_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dast_dbin_fk_i ON data_stores USING btree (dbin_id); - - --- --- Name: data_dsty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_dsty_fk_i ON data USING btree (dsty_id); - - --- --- Name: data_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_expe_fk_i ON data USING btree (expe_id); - - --- --- Name: data_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX data_samp_fk_i ON data USING btree (samp_id); - - --- --- Name: dspr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_cvte_fk_i ON data_set_properties USING btree (cvte_id); - - --- --- Name: dspr_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_ds_fk_i ON data_set_properties USING btree (ds_id); - - --- --- Name: dspr_dstpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_dstpt_fk_i ON data_set_properties USING btree (dstpt_id); - - --- --- Name: dspr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dspr_pers_fk_i ON data_set_properties USING btree (pers_id_registerer); - - --- --- Name: dsre_data_fk_i_child; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsre_data_fk_i_child ON data_set_relationships USING btree (data_id_child); - - --- --- Name: dsre_data_fk_i_parent; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsre_data_fk_i_parent ON data_set_relationships USING btree (data_id_parent); - - --- --- Name: dssdst_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dssdst_ds_fk_i ON data_store_service_data_set_types USING btree (data_store_service_id); - - --- --- Name: dssdst_dst_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dssdst_dst_fk_i ON data_store_service_data_set_types USING btree (data_set_type_id); - - --- --- Name: dsse_ds_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dsse_ds_fk_i ON data_store_services USING btree (data_store_id); - - --- --- Name: dstpt_dsty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_dsty_fk_i ON data_set_type_property_types USING btree (dsty_id); - - --- --- Name: dstpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_pers_fk_i ON data_set_type_property_types USING btree (pers_id_registerer); - - --- --- Name: dstpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX dstpt_prty_fk_i ON data_set_type_property_types USING btree (prty_id); - - --- --- Name: etpt_exty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_exty_fk_i ON experiment_type_property_types USING btree (exty_id); - - --- --- Name: etpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_pers_fk_i ON experiment_type_property_types USING btree (pers_id_registerer); - - --- --- Name: etpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX etpt_prty_fk_i ON experiment_type_property_types USING btree (prty_id); - - --- --- Name: evnt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX evnt_pers_fk_i ON events USING btree (pers_id_registerer); - - --- --- Name: exda_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_cvte_fk_i ON external_data USING btree (cvte_id_stor_fmt); - - --- --- Name: exda_cvte_stored_on_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_cvte_stored_on_fk_i ON external_data USING btree (cvte_id_store); - - --- --- Name: exda_ffty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_ffty_fk_i ON external_data USING btree (ffty_id); - - --- --- Name: exda_loty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX exda_loty_fk_i ON external_data USING btree (loty_id); - - --- --- Name: expe_exty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_exty_fk_i ON experiments USING btree (exty_id); - - --- --- Name: expe_inva_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_inva_fk_i ON experiments USING btree (inva_id); - - --- --- Name: expe_mate_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_mate_fk_i ON experiments USING btree (mate_id_study_object); - - --- --- Name: expe_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_pers_fk_i ON experiments USING btree (pers_id_registerer); - - --- --- Name: expe_proj_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expe_proj_fk_i ON experiments USING btree (proj_id); - - --- --- Name: expr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_cvte_fk_i ON experiment_properties USING btree (cvte_id); - - --- --- Name: expr_etpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_etpt_fk_i ON experiment_properties USING btree (etpt_id); - - --- --- Name: expr_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_expe_fk_i ON experiment_properties USING btree (expe_id); - - --- --- Name: expr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX expr_pers_fk_i ON experiment_properties USING btree (pers_id_registerer); - - --- --- Name: filt_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX filt_dbin_fk_i ON filters USING btree (dbin_id); - - --- --- Name: filt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX filt_pers_fk_i ON filters USING btree (pers_id_registerer); - - --- --- Name: grid_custom_columns_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grid_custom_columns_dbin_fk_i ON grid_custom_columns USING btree (dbin_id); - - --- --- Name: grid_custom_columns_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grid_custom_columns_pers_fk_i ON grid_custom_columns USING btree (pers_id_registerer); - - --- --- Name: grou_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grou_dbin_fk_i ON groups USING btree (dbin_id); - - --- --- Name: grou_pers_registered_by_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX grou_pers_registered_by_fk_i ON groups USING btree (pers_id_registerer); - - --- --- Name: inva_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX inva_pers_fk_i ON invalidations USING btree (pers_id_registerer); - - --- --- Name: mapr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_cvte_fk_i ON material_properties USING btree (cvte_id); - - --- --- Name: mapr_mate_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_mate_fk_i ON material_properties USING btree (mate_id); - - --- --- Name: mapr_mtpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_mtpt_fk_i ON material_properties USING btree (mtpt_id); - - --- --- Name: mapr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mapr_pers_fk_i ON material_properties USING btree (pers_id_registerer); - - --- --- Name: mate_maty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mate_maty_fk_i ON materials USING btree (maty_id); - - --- --- Name: mate_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mate_pers_fk_i ON materials USING btree (pers_id_registerer); - - --- --- Name: mtpt_maty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_maty_fk_i ON material_type_property_types USING btree (maty_id); - - --- --- Name: mtpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_pers_fk_i ON material_type_property_types USING btree (pers_id_registerer); - - --- --- Name: mtpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX mtpt_prty_fk_i ON material_type_property_types USING btree (prty_id); - - --- --- Name: pers_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX pers_grou_fk_i ON persons USING btree (grou_id); - - --- --- Name: proj_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_grou_fk_i ON projects USING btree (grou_id); - - --- --- Name: proj_pers_fk_i_leader; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_pers_fk_i_leader ON projects USING btree (pers_id_leader); - - --- --- Name: proj_pers_fk_i_registerer; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX proj_pers_fk_i_registerer ON projects USING btree (pers_id_registerer); - - --- --- Name: prty_covo_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_covo_fk_i ON property_types USING btree (covo_id); - - --- --- Name: prty_daty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_daty_fk_i ON property_types USING btree (daty_id); - - --- --- Name: prty_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX prty_pers_fk_i ON property_types USING btree (pers_id_registerer); - - --- --- Name: roas_ag_fk_i_grantee; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_ag_fk_i_grantee ON role_assignments USING btree (ag_id_grantee); - - --- --- Name: roas_dbin_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_dbin_fk_i ON role_assignments USING btree (dbin_id); - - --- --- Name: roas_grou_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_grou_fk_i ON role_assignments USING btree (grou_id); - - --- --- Name: roas_pers_fk_i_grantee; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_pers_fk_i_grantee ON role_assignments USING btree (pers_id_grantee); - - --- --- Name: roas_pers_fk_i_registerer; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX roas_pers_fk_i_registerer ON role_assignments USING btree (pers_id_registerer); - - --- --- Name: samp_code_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_code_i ON samples USING btree (code); - - --- --- Name: samp_expe_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_expe_fk_i ON samples USING btree (expe_id); - - --- --- Name: samp_inva_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_inva_fk_i ON samples USING btree (inva_id); - - --- --- Name: samp_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_pers_fk_i ON samples USING btree (pers_id_registerer); - - --- --- Name: samp_samp_fk_i_control_layout; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_control_layout ON samples USING btree (samp_id_control_layout); - - --- --- Name: samp_samp_fk_i_generated_from; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_generated_from ON samples USING btree (samp_id_generated_from); - - --- --- Name: samp_samp_fk_i_part_of; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_part_of ON samples USING btree (samp_id_part_of); - - --- --- Name: samp_samp_fk_i_top; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_samp_fk_i_top ON samples USING btree (samp_id_top); - - --- --- Name: samp_saty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX samp_saty_fk_i ON samples USING btree (saty_id); - - --- --- Name: sapr_cvte_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_cvte_fk_i ON sample_properties USING btree (cvte_id); - - --- --- Name: sapr_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_pers_fk_i ON sample_properties USING btree (pers_id_registerer); - - --- --- Name: sapr_samp_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_samp_fk_i ON sample_properties USING btree (samp_id); - - --- --- Name: sapr_stpt_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX sapr_stpt_fk_i ON sample_properties USING btree (stpt_id); - - --- --- Name: stpt_pers_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_pers_fk_i ON sample_type_property_types USING btree (pers_id_registerer); - - --- --- Name: stpt_prty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_prty_fk_i ON sample_type_property_types USING btree (prty_id); - - --- --- Name: stpt_saty_fk_i; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX stpt_saty_fk_i ON sample_type_property_types USING btree (saty_id); - - --- --- Name: check_dataset_relationships_on_data_table_modification; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_data_table_modification - AFTER INSERT OR UPDATE ON data -DEFERRABLE INITIALLY DEFERRED - FOR EACH ROW - EXECUTE PROCEDURE check_dataset_relationships_on_data_table_modification(); - - --- --- Name: check_dataset_relationships_on_relationships_table_modification; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE CONSTRAINT TRIGGER check_dataset_relationships_on_relationships_table_modification - AFTER INSERT OR UPDATE ON data_set_relationships -DEFERRABLE INITIALLY DEFERRED - FOR EACH ROW - EXECUTE PROCEDURE check_dataset_relationships_on_relationships_table_modification(); - - --- --- Name: controlled_vocabulary_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER controlled_vocabulary_check - BEFORE INSERT OR UPDATE ON property_types - FOR EACH ROW - EXECUTE PROCEDURE controlled_vocabulary_check(); - - --- --- Name: data_set_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER data_set_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON data_set_properties - FOR EACH ROW - EXECUTE PROCEDURE data_set_property_with_material_data_type_check(); - - --- --- Name: experiment_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER experiment_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON experiment_properties - FOR EACH ROW - EXECUTE PROCEDURE experiment_property_with_material_data_type_check(); - - --- --- Name: external_data_storage_format_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER external_data_storage_format_check - BEFORE INSERT OR UPDATE ON external_data - FOR EACH ROW - EXECUTE PROCEDURE external_data_storage_format_check(); - - --- --- Name: material_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER material_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON material_properties - FOR EACH ROW - EXECUTE PROCEDURE material_property_with_material_data_type_check(); - - --- --- Name: sample_code_uniqueness_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER sample_code_uniqueness_check - BEFORE INSERT OR UPDATE ON samples - FOR EACH ROW - EXECUTE PROCEDURE sample_code_uniqueness_check(); - - --- --- Name: sample_property_with_material_data_type_check; Type: TRIGGER; Schema: public; Owner: - --- - -CREATE TRIGGER sample_property_with_material_data_type_check - BEFORE INSERT OR UPDATE ON sample_properties - FOR EACH ROW - EXECUTE PROCEDURE sample_property_with_material_data_type_check(); - - --- --- Name: ag_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: ag_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_groups - ADD CONSTRAINT ag_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: agp_ag_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_ag_fk FOREIGN KEY (ag_id) REFERENCES authorization_groups(id); - - --- --- Name: agp_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY authorization_group_persons - ADD CONSTRAINT agp_pers_fk FOREIGN KEY (pers_id) REFERENCES persons(id); - - --- --- Name: atta_cont_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_cont_fk FOREIGN KEY (exac_id) REFERENCES attachment_contents(id); - - --- --- Name: atta_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: atta_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: atta_proj_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id); - - --- --- Name: atta_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY attachments - ADD CONSTRAINT atta_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: covo_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: covo_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabularies - ADD CONSTRAINT covo_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: cvte_covo_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_covo_fk FOREIGN KEY (covo_id) REFERENCES controlled_vocabularies(id); - - --- --- Name: cvte_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY controlled_vocabulary_terms - ADD CONSTRAINT cvte_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dast_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_stores - ADD CONSTRAINT dast_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: data_dast_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_dast_fk FOREIGN KEY (dast_id) REFERENCES data_stores(id); - - --- --- Name: data_dsty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_dsty_fk FOREIGN KEY (dsty_id) REFERENCES data_set_types(id); - - --- --- Name: data_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: data_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data - ADD CONSTRAINT data_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: dspr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: dspr_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_ds_fk FOREIGN KEY (ds_id) REFERENCES data(id); - - --- --- Name: dspr_dstpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_dstpt_fk FOREIGN KEY (dstpt_id) REFERENCES data_set_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: dspr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: dspr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_properties - ADD CONSTRAINT dspr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dsre_data_fk_child; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_data_fk_child FOREIGN KEY (data_id_child) REFERENCES data(id); - - --- --- Name: dsre_data_fk_parent; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_relationships - ADD CONSTRAINT dsre_data_fk_parent FOREIGN KEY (data_id_parent) REFERENCES data(id); - - --- --- Name: dssdst_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_ds_fk FOREIGN KEY (data_store_service_id) REFERENCES data_store_services(id) ON DELETE CASCADE; - - --- --- Name: dssdst_dst_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_service_data_set_types - ADD CONSTRAINT dssdst_dst_fk FOREIGN KEY (data_set_type_id) REFERENCES data_set_types(id) ON DELETE CASCADE; - - --- --- Name: dsse_ds_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_store_services - ADD CONSTRAINT dsse_ds_fk FOREIGN KEY (data_store_id) REFERENCES data_stores(id) ON DELETE CASCADE; - - --- --- Name: dstpt_dsty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_dsty_fk FOREIGN KEY (dsty_id) REFERENCES data_set_types(id) ON DELETE CASCADE; - - --- --- Name: dstpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: dstpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_type_property_types - ADD CONSTRAINT dstpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: dsty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY data_set_types - ADD CONSTRAINT dsty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: etpt_exty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_exty_fk FOREIGN KEY (exty_id) REFERENCES experiment_types(id) ON DELETE CASCADE; - - --- --- Name: etpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: etpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_type_property_types - ADD CONSTRAINT etpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: evnt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY events - ADD CONSTRAINT evnt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: exda_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_cvte_fk FOREIGN KEY (cvte_id_stor_fmt) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: exda_cvte_stored_on_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_cvte_stored_on_fk FOREIGN KEY (cvte_id_store) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: exda_data_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_data_fk FOREIGN KEY (data_id) REFERENCES data(id); - - --- --- Name: exda_ffty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_ffty_fk FOREIGN KEY (ffty_id) REFERENCES file_format_types(id); - - --- --- Name: exda_loty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY external_data - ADD CONSTRAINT exda_loty_fk FOREIGN KEY (loty_id) REFERENCES locator_types(id); - - --- --- Name: expe_exty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_exty_fk FOREIGN KEY (exty_id) REFERENCES experiment_types(id); - - --- --- Name: expe_inva_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_inva_fk FOREIGN KEY (inva_id) REFERENCES invalidations(id); - - --- --- Name: expe_mate_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_mate_fk FOREIGN KEY (mate_id_study_object) REFERENCES materials(id); - - --- --- Name: expe_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: expe_proj_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiments - ADD CONSTRAINT expe_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id); - - --- --- Name: expr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: expr_etpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_etpt_fk FOREIGN KEY (etpt_id) REFERENCES experiment_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: expr_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: expr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: expr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_properties - ADD CONSTRAINT expr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: exty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY experiment_types - ADD CONSTRAINT exty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: ffty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY file_format_types - ADD CONSTRAINT ffty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: filt_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: filt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY filters - ADD CONSTRAINT filt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: grid_custom_columns_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: grid_custom_columns_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY grid_custom_columns - ADD CONSTRAINT grid_custom_columns_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: grou_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: grou_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY groups - ADD CONSTRAINT grou_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: inva_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY invalidations - ADD CONSTRAINT inva_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mapr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: mapr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: mapr_mate_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mate_fk FOREIGN KEY (mate_id) REFERENCES materials(id); - - --- --- Name: mapr_mtpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_mtpt_fk FOREIGN KEY (mtpt_id) REFERENCES material_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: mapr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_properties - ADD CONSTRAINT mapr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mate_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: mate_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_maty_fk FOREIGN KEY (maty_id) REFERENCES material_types(id); - - --- --- Name: mate_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY materials - ADD CONSTRAINT mate_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: maty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_types - ADD CONSTRAINT maty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: mtpt_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_maty_fk FOREIGN KEY (maty_id) REFERENCES material_types(id) ON DELETE CASCADE; - - --- --- Name: mtpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: mtpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY material_type_property_types - ADD CONSTRAINT mtpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: pers_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: pers_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: pers_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY persons - ADD CONSTRAINT pers_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: proj_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: proj_pers_fk_leader; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pers_fk_leader FOREIGN KEY (pers_id_leader) REFERENCES persons(id); - - --- --- Name: proj_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY projects - ADD CONSTRAINT proj_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: prty_covo_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_covo_fk FOREIGN KEY (covo_id) REFERENCES controlled_vocabularies(id); - - --- --- Name: prty_daty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_daty_fk FOREIGN KEY (daty_id) REFERENCES data_types(id); - - --- --- Name: prty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: prty_maty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_maty_fk FOREIGN KEY (maty_prop_id) REFERENCES material_types(id) ON DELETE CASCADE; - - --- --- Name: prty_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY property_types - ADD CONSTRAINT prty_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: quer_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: quer_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY queries - ADD CONSTRAINT quer_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: roas_ag_fk_grantee; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_ag_fk_grantee FOREIGN KEY (ag_id_grantee) REFERENCES authorization_groups(id); - - --- --- Name: roas_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: roas_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: roas_pers_fk_grantee; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pers_fk_grantee FOREIGN KEY (pers_id_grantee) REFERENCES persons(id); - - --- --- Name: roas_pers_fk_registerer; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY role_assignments - ADD CONSTRAINT roas_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: samp_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: samp_expe_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id); - - --- --- Name: samp_grou_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_grou_fk FOREIGN KEY (grou_id) REFERENCES groups(id); - - --- --- Name: samp_inva_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_inva_fk FOREIGN KEY (inva_id) REFERENCES invalidations(id); - - --- --- Name: samp_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: samp_samp_fk_control_layout; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_control_layout FOREIGN KEY (samp_id_control_layout) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_generated_from; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_generated_from FOREIGN KEY (samp_id_generated_from) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_part_of; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_part_of FOREIGN KEY (samp_id_part_of) REFERENCES samples(id); - - --- --- Name: samp_samp_fk_top; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_samp_fk_top FOREIGN KEY (samp_id_top) REFERENCES samples(id); - - --- --- Name: samp_saty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY samples - ADD CONSTRAINT samp_saty_fk FOREIGN KEY (saty_id) REFERENCES sample_types(id); - - --- --- Name: sapr_cvte_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id); - - --- --- Name: sapr_mapr_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id); - - --- --- Name: sapr_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: sapr_samp_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id); - - --- --- Name: sapr_stpt_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_properties - ADD CONSTRAINT sapr_stpt_fk FOREIGN KEY (stpt_id) REFERENCES sample_type_property_types(id) ON DELETE CASCADE; - - --- --- Name: saty_dbin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_types - ADD CONSTRAINT saty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id); - - --- --- Name: stpt_pers_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id); - - --- --- Name: stpt_prty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_prty_fk FOREIGN KEY (prty_id) REFERENCES property_types(id) ON DELETE CASCADE; - - --- --- Name: stpt_saty_fk; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY sample_type_property_types - ADD CONSTRAINT stpt_saty_fk FOREIGN KEY (saty_id) REFERENCES sample_types(id) ON DELETE CASCADE; - - --- --- PostgreSQL database dump complete --- - diff --git a/plasmid/resource/db/recreate_db.sh b/plasmid/resource/db/recreate_db.sh deleted file mode 100755 index ba2468948f716c25ccffdc640e133b39e12b0c48..0000000000000000000000000000000000000000 --- a/plasmid/resource/db/recreate_db.sh +++ /dev/null @@ -1,4 +0,0 @@ -OWNER=buczekp -psql -U postgres -c "drop database openbis_plasmids;" -psql -U postgres -c "create database openbis_plasmids with owner $OWNER encoding = 'UNICODE';" -psql -U $OWNER -d openbis_plasmids -f plasmids-YeastLab.sql diff --git a/plasmid/resource/dependency-structure.ddf b/plasmid/resource/dependency-structure.ddf deleted file mode 100644 index b20e92723a940d8673288145c7f0bb98a2bf5278..0000000000000000000000000000000000000000 --- a/plasmid/resource/dependency-structure.ddf +++ /dev/null @@ -1,16 +0,0 @@ -#show allResults - -{root} = ch.ethz.bsse.cisd.plasmid -{dss} = ${root}.dss -{openbis} = ch.systemsx.cisd.openbis - -###################################################################### -# Check dependencies to openbis - -[dss] = ${dss}.* -[private_openbis] = ${openbis}.* excluding [dss] ${openbis}.dss.generic.shared.* ${openbis}.generic.shared.* ${openbis}.dss.generic.server.plugins.* ${openbis}.common.* - -check sets [dss] - -check [dss] independentOf [private_openbis] - diff --git a/plasmid/resource/eclipse/plasmid Data Store Server.launch b/plasmid/resource/eclipse/plasmid Data Store Server.launch deleted file mode 100644 index d4bfed2f3ac7a6eefdfd59ebfeaa1833afddcaf5..0000000000000000000000000000000000000000 --- a/plasmid/resource/eclipse/plasmid Data Store Server.launch +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/DataStoreServer.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.debug.ui.launchGroup.run"/> -</listAttribute> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.systemsx.cisd.openbis.dss.generic.DataStoreServer"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="plasmid"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512M -ea"/> -</launchConfiguration> diff --git a/plasmid/resource/example/FRP_1/PRS316-1.ab1 b/plasmid/resource/example/FRP_1/PRS316-1.ab1 deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/FRP_1/PRS316-1.ab1 +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/example/FRP_1/PRS316-2.ab1 b/plasmid/resource/example/FRP_1/PRS316-2.ab1 deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/FRP_1/PRS316-2.ab1 +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/example/FRP_1/PRS316-3.ab1 b/plasmid/resource/example/FRP_1/PRS316-3.ab1 deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/FRP_1/PRS316-3.ab1 +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/example/FRP_1/PRS316.fasta b/plasmid/resource/example/FRP_1/PRS316.fasta deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/FRP_1/PRS316.fasta +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/example/FRP_1/PRS316.gb b/plasmid/resource/example/FRP_1/PRS316.gb deleted file mode 100644 index e33465983622dfc0c12a4c407740b02c146ecb2b..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/FRP_1/PRS316.gb +++ /dev/null @@ -1,229 +0,0 @@ -ID PRS316 preliminary; circular DNA; SYN; 4887 BP. -XX -AC U03442; ATCC77145; -XX -DT 01-JUL-1993 (Rel. 7, Created) -DT 01-JUL-1995 (Rel. 12, Last updated, Version 1) -XX -DE Saccharomyces/E.coli phagemid vector pRS316 - complete. -XX -KW cloning vector. -XX -OS Cloning vector -OC Artificial sequences; Cloning vehicles. -XX -RN [1] -RP 1-4887 -RC pRSS56 from pBluescript KS+ & BlueScribe -RC pRS303 from pRSS56 & HIS3 gene -RC pRS304 from pRSS56 & TRP1 gene -RC pRS305 from pRSS56 & LEU2 gene -RC pRS306 from pRSS56 & URA3 gene -RC pUC19-CEN6:32 from pUC19 & CEN6 -RC pRSS83 from pUC19-CEN6:32 & pAB9, ARS -RC pRSS84 from pRSS83 -RC pRS313 from pRS303 & pRSS84 -RC pRS314 from pRS304 & pRSS84 -RC pRS315 from pRS305 & pRSS84 -RC pRS316 from pRS306 & pRSS84 -RC pRSS93 from pRSS84 & pYCF5 -RA Sikorski R.S., Hieter P.; -RT "A system of shuttle vectors and yeast host strains designed for -RT efficient manipulation of DNA in Saccharomyces cerevisiae"; -RL Genetics 122:19-27(1989). -XX -RN [2] -RC from YEp24 -RC from YCp50 -RC from YIp5 -RA Strathern J.N., Higgins D.R.; -RT "Recovery of plasmids from yeast into Escherichia coli: shuttle -RT vectors"; -RL Meth. Enzymol. 194:319-329(1991). -XX -RN [3] -RC pRS316 -RA Stillman D.J.; -RT ; -RL Submitted (10-NOV-1993) by: -RL Stillman D.J., Dept. of Cellular, Viral and Molecular Biology, -RL University of Utah Medical Center, Salt Lake City, UT 84132 USA. -XX -CC One of a series of pBluescript-based centromere vectors (ATCC 77142 -CC ATCC 77145, ATCC 77157 to ATCC 77158) differing in the yeast -CC selectable marker gene. [1] -CC The order of the major features in this plasmid is: URA3 - f1 ori -CC (NaeI) - T7 promoter - lacZ'/MCS - T3 promoter - pMB1 ori - bla - -CC CEN6 - ARSH4. -CC A fragment (1.112 kb) containing the URA3 gene was inserted into the -CC NdeI site and a cassette containing CEN6 and the ARS associated with -CC histone 4 (ARSH4) was inserted into the AatII site of pRSS56. All ends -CC were blunted. -CC pRSS56, constructed by ligating a PvuI fragment (bp 498-2412) of -CC pBluescript KS+ to a PvuI fragment (bp 2850-730) of pBS(+), contains -CC the KS MCS from pBluescript KS+ and the unique NdeI and AatII sites -CC between bla and f1 origin of pBS(+). [1] -CC YC-type centromere vector permitting visual detection of recombinants -CC and production of ssDNA in E.coli. Contains promoters for in vitro -CC RNA synthesis, priming sites useful for sequencing, and encodes the -CC lacZ alpha (lacZ') peptide. [1] -CC Useful in plasmid shuffle experiments. -CC Restriction digests of the clone give the following sizes (kb): -CC EcoRI--5.0; BamHI--5.0, PvuII--4.4, 0.5. (ATCC staff) -CC Medium is 1227 LB plus ampicillin. -CC NCBI gi: 417973 -CC NM (pRS316) -CC CM (yes) -CC NA (ds-DNA) -CC TP (circular) -CC ST () -CC TY (phagemid) -CC SP (ATCC) -CC HO (E.coli HB101)(Saccharomyces cerevisiae)(E.coli) -CC HO (Saccharomyces cerevisiae YPH499)(Saccharomyces cerevisiae YPH500) -CC HO (Saccharomyces cerevisiae YPH501) -CC CP () -CC FN (cloning) -CC SE () -CC PA () -CC BR (pRS314)(pRS315)(pRS313) -CC OF () -CC OR () -XX -FH Key Location/Qualifiers -FH -FT misc_feature 0..0 -FT /note="1. pUC19 HincII 2686bp 432..432 -FT 2. yeast MboII-MboII 125bp, CEN6 -FT -> pUC19-CEN6:32 2811bp -FT 1. pUC8 BamHI 2665bp 241..241 -FT 2. yeast Sau3AI-Sau3AI 374bp, histone H4 ARS/ARSH4 -FT -> pAB9 3039bp -FT 1. pUC19-CEN6:32 EcoRI-ScaI 1908bp 397..-..2180, CEN6 -FT 2. pAB9 ScaI-EcoRI 1314bp 231..-..1171, -FT \ histone H4 ARS/ARSH4 -FT -> pRSS83 3222bp [in MCS] -FT 1. pRSS83 remove SmaI-XbaI 9bp, MCS/pUC19 415..424 -FT \ 3213bp -FT Klenow:Klenow -FT -> pRSS84 3213bp -FT 1. pRSS84 HincII-PstI, CEN6/ARSH4 -FT \ pUC19 440..2686..432 -FT T4 DNA polymerase:T4 DNA polymerase -FT 2. pRS306 AatII 4373bp 848..848 -FT T4 DNA polymerase:T4 DNA polymerase -FT -> pRS316 4887bp" -FT misc_binding 0..0 -FT /note="MCS KpnI-ApaI-XhoI-SalI-ClaI-HindIII-EcoRV- -FT EcoRI-PstI-SmaI- -FT BamHI-SpeI-XbaI-EagI-NotI-BstXI-SacII-SacI" -FT misc_binding 0..0 -FT /note="SIT unique KpnI-ApaI-XhoI-SalI-ClaI-EcoRI- -FT PstI-SmaI-BamHI-SpeI-EagI-NotI-SacII-SacI-NaeI" -FT rep_origin 0..0 -FT /note="ORI E. coli pMB1 (ColE1 and pBR322)" -FT rep_origin 0..0 -FT /note="ORI bacteriophage f1" -FT promoter 0..0 -FT /note="PRO E. coli lac gene" -FT promoter 0..0 -FT /note="PRO bacteriophage T3" -FT promoter 0..0 -FT /note="PRO bacteriophage T7" -FT CDS 0..0 -FT /note="GEN E. coli beta-galactosidase gene (lacZ'); -FT reporter gene" -FT CDS 0..0 -FT /note="ANT E. coli beta-lactamase gene (bla) -FT ampicillin resistance gene (apr/amp)" -FT CDS 0..0 -FT /note="ANT yeast URA3 gene" -FT rep_origin 0..0 -FT /note="ORI yeast ARSH4" -FT misc_feature 0..0 -FT /note="yeast centromere CEN6" -XX -SQ Sequence 4887 BP; 1361 A; 1069 C; 1167 G; 1290 T; 0 other; - tcgcgcgttt cggtgatgac ggtgaaaacc tctgacacat gcagctcccg gagacggtca - cagcttgtct gtaagcggat gccgggagca gacaagcccg tcagggcgcg tcagcgggtg - ttggcgggtg tcggggctgg cttaactatg cggcatcaga gcagattgta ctgagagtgc - accacgcttt tcaattcaat tcatcatttt ttttttattc ttttttttga tttcggtttc - tttgaaattt ttttgattcg gtaatctccg aacagaagga agaacgaagg aaggagcaca - gacttagatt ggtatatata cgcatatgta gtgttgaaga aacatgaaat tgcccagtat - tcttaaccca actgcacaga acaaaaacct gcaggaaacg aagataaatc atgtcgaaag - ctacatataa ggaacgtgct gctactcatc ctagtcctgt tgctgccaag ctatttaata - tcatgcacga aaagcaaaca aacttgtgtg cttcattgga tgttcgtacc accaaggaat - tactggagtt agttgaagca ttaggtccca aaatttgttt actaaaaaca catgtggata - tcttgactga tttttccatg gagggcacag ttaagccgct aaaggcatta tccgccaagt - acaatttttt actcttcgaa gacagaaaat ttgctgacat tggtaataca gtcaaattgc - agtactctgc gggtgtatac agaatagcag aatgggcaga cattacgaat gcacacggtg - tggtgggccc aggtattgtt agcggtttga agcaggcggc agaagaagta acaaaggaac - ctagaggcct tttgatgtta gcagaattgt catgcaaggg ctccctatct actggagaat - atactaaggg tactgttgac attgcgaaga gcgacaaaga ttttgttatc ggctttattg - ctcaaagaga catgggtgga agagatgaag gttacgattg gttgattatg acacccggtg - tgggtttaga tgacaaggga gacgcattgg gtcaacagta tagaaccgtg gatgatgtgg - tctctacagg atctgacatt attattgttg gaagaggact atttgcaaag ggaagggatg - ctaaggtaga gggtgaacgt tacagaaaag caggctggga agcatatttg agaagatgcg - gccagcaaaa ctaaaaaact gtattataag taaatgcatg tatactaaac tcacaaatta - gagcttcaat ttaattatat cagttattac cctgcggtgt gaaataccgc acagatgcgt - aaggagaaaa taccgcatca ggaaattgta aacgttaata ttttgttaaa attcgcgtta - aatttttgtt aaatcagctc attttttaac caataggccg aaatcggcaa aatcccttat - aaatcaaaag aatagaccga gatagggttg agtgttgttc cagtttggaa caagagtcca - ctattaaaga acgtggactc caacgtcaaa gggcgaaaaa ccgtctatca gggcgatggc - ccactacgtg aaccatcacc ctaatcaagt tttttggggt cgaggtgccg taaagcacta - aatcggaacc ctaaagggag cccccgattt agagcttgac ggggaaagcc ggcgaacgtg - gcgagaaagg aagggaagaa agcgaaagga gcgggcgcta gggcgctggc aagtgtagcg - gtcacgctgc gcgtaaccac cacacccgcc gcgcttaatg cgccgctaca gggcgcgtcg - cgccattcgc cattcaggct gcgcaactgt tgggaagggc gatcggtgcg ggcctcttcg - ctattacgcc agctggcgaa ggggggatgt gctgcaaggc gattaagttg ggtaacgcca - gggttttccc agtcacgacg ttgtaaaacg acggccagtg aattgtaata cgactcacta - tagggcgaat tggagctcca ccgcggtggc ggccgctcta gaactagtgg atcccccggg - ctgcaggaat tcgatatcaa gcttatcgat accgtcgacc tcgagggggg gcccggtacc - cagcttttgt tccctttagt gagggttaat tccgagcttg gcgtaatcat ggtcatagct - gtttcctgtg tgaaattgtt atccgctcac aattccacac aacataggag ccggaagcat - aaagtgtaaa gcctggggtg cctaatgagt gaggtaactc acattaattg cgttgcgctc - actgcccgct ttccagtcgg gaaacctgtc gtgccagctg cattaatgaa tcggccaacg - cgcggggaga ggcggtttgc gtattgggcg ctcttccgct tcctcgctca ctgactcgct - gcgctcggtc gttcggctgc ggcgagcggt atcagctcac tcaaaggcgg taatacggtt - atccacagaa tcaggggata acgcaggaaa gaacatgtga gcaaaaggcc agcaaaaggc - caggaaccgt aaaaaggccg cgttgctggc gtttttccat aggctcggcc cccctgacga - gcatcacaaa aatcgacgct caagtcagag gtggcgaaac ccgacaggac tataaagata - ccaggcgttc ccccctggaa gctccctcgt gcgctctcct gttccgaccc tgccgcttac - cggatacctg tccgcctttc tcccttcggg aagcgtggcg ctttctcaat gctcacgctg - taggtatctc agttcggtgt aggtcgttcg ctccaagctg ggctgtgtgc acgaaccccc - cgttcagccc gaccgctgcg ccttatccgg taactatcgt cttgagtcca acccggtaag - acacgactta tcgccactgg cagcagccac tggtaacagg attagcagag cgaggtatgt - aggcggtgct acagagttct tgaagtggtg gcctaactac ggctacacta gaaggacagt - atttggtatc tgcgctctgc tgaagccagt taccttcgga aaaagagttg gtagctcttg - atccggcaaa caaaccaccg ctggtagcgg tggttttttt gtttgcaagc agcagattac - gcgcagaaaa aaaggatctc aagaagatcc tttgatcttt tctacggggt ctgacgctca - gtggaacgaa aactcacgtt aagggatttt ggtcatgaga ttatcaaaaa ggatcttcac - ctagatcctt ttaaattaaa aatgaagttt taaatcaatc taaagtatat atgagtaaac - ttggtctgac agttaccaat gcttaatcag tgaggcacct atctcagcga tctgtctatt - tcgttcatcc atagttgcct gactgcccgt cgtgtagata actacgatac gggagggctt - accatctggc cccagtgctg caatgatacc gcgagaccca cgctcaccgg ctccagattt - atcagcaata aaccagccag ccggaagggc cgagcgcaga agtggtcctg caactttatc - cgcctccatc cagtctatta attgttgccg ggaagctaga gtaagtagtt cgccagttaa - tagtttgcgc aacgttgttg ccattgctac aggcatcgtg gtgtcacgct cgtcgtttgg - tatggcttca ttcagctccg gttcccaacg atcaaggcga gttacatgat cccccatgtt - gtgaaaaaaa gcggttagct ccttcggtcc tccgatcgtt gtcagaagta agttggccgc - agtgttatca ctcatggtta tggcagcact gcataattct cttactgtca tgccatccgt - aagatgcttt tctgtgactg gtgagtactc aaccaagtca ttctgagaat agtgtatgcg - gcgaccgagt tgctcttgcc cggcgtcaat acgggataat accgcgccac atagcagaac - tttaaaagtg ctcatcattg gaaaacgttc ttcggggcga aaactctcaa ggatcttacc - gctgttgaga tccagttcga tgtaacccac tcgtgcaccc aactgatctt cagcatcttt - tactttcacc agcgtttctg ggtgagcaaa aacaggaagg caaaatgccg caaaaaaggg - aataagggcg acacggaaat gttgaatact catactcttc ctttttcaat attattgaag - catttatcag ggttattgtc tcatgagcgg atacatattt gaatgtattt agaaaaataa - acaaataggg gttccgcgca catttccccg aaaagtgcca cctgggtcct tttcatcacg - tgctataaaa ataattataa tttaaatttt ttaatataaa tatataaatt aaaaatagaa - agtaaaaaaa gaaattaaag aaaaaatagt ttttgttttc cgaagatgta aaagactcta - gggggatcgc caacaaatac taccttttat cttgctcttc ctgctctcag gtattaatgc - cgaattgttt catcttgtct gtgtagaaga ccacacacga aaatcctgtg attttacatt - ttacttatcg ttaatcgaat gtatatctat ttaatctgct tttcttgtct aataaatata - tatgtaaagt acgctttttg ttgaaatttt ttaaaccttt gtttattttt ttttcttcat - tccgtaactc ttctaccttc tttatttact ttctaaaatc caaatacaaa acataaaaat - aaataaacac agagtaaatt cccaaattat tccatcatta aaagatacga ggcgcgtgta - agttacaggc aagcgatccg tcctaagaaa ccattattat catgacatta acctataaaa - ataggcgtat cacgaggccc tttcgtc -// diff --git a/plasmid/resource/example/FRP_1/PRS316.png b/plasmid/resource/example/FRP_1/PRS316.png deleted file mode 100644 index b2b62aa7f5164c0d9f8bea5b1952f08deba940ec..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/example/FRP_1/PRS316.png and /dev/null differ diff --git a/plasmid/resource/example/FRP_1/PRS316.tiff b/plasmid/resource/example/FRP_1/PRS316.tiff deleted file mode 100644 index 6c9e458b07e345d71c93310a2176ae94a9b1f367..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/example/FRP_1/PRS316.tiff and /dev/null differ diff --git a/plasmid/resource/example/SAMPLE-PLASMID-template.xlsx b/plasmid/resource/example/SAMPLE-PLASMID-template.xlsx deleted file mode 100644 index fc22660c5459a37c77647c9fa956be5c98007af2..0000000000000000000000000000000000000000 Binary files a/plasmid/resource/example/SAMPLE-PLASMID-template.xlsx and /dev/null differ diff --git a/plasmid/resource/example/sample-import.tsv b/plasmid/resource/example/sample-import.tsv deleted file mode 100644 index a7366f63b36fa2ea2272f64e42284931b8c0c67f..0000000000000000000000000000000000000000 --- a/plasmid/resource/example/sample-import.tsv +++ /dev/null @@ -1 +0,0 @@ -[PLASMID_BOX] # Comments must be located after the type declaration ('[TYPE]'). "# The ""container"" and ""parent"" columns are optional, only one should be specified. They should contain a sample identifier, e.g. /SPACE/SAMPLE_1" "# If ""container"" sample is provided, the registered sample will become a ""component"" of it." "# If ""parent"" sample is provided, the registered sample will become a ""child"" of it." "# The ""experiment"" column is optional, cannot be specified for shared samples and should contain experiment identifier, e.g. /SPACE/PROJECT/EXP_1" identifier container parent experiment BOX_SIZE BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 81_BOX BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 96_WELL [PLASMID] identifier container parent experiment OWNER OWNER_NUMBER PLASMID_NAME BACKBONE DERIVATIVE_OF BACTERIAL_ANTIBIOTIC_RESISTANCE YEAST_MARKER OTHER_MARKER FLANKING_RESTRICTION_ENZYMES COMMENTS ROW COLUMN FRP_1 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 FABIAN_RUDOLF pFR1 pBluescript II KS+ pBluescript_II_KS_PLUS bla original Bluescript plasmid A 0 FRP_27 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 10 pGal416N pRS41y bla URA3 removed NaeI site (NgoMIV,Mung Bean Nuclease) A 0 [PLASMID] identifier container parent experiment OWNER OWNER_NUMBER PLASMID_NAME BACKBONE DERIVATIVE_OF BACTERIAL_ANTIBIOTIC_RESISTANCE YEAST_MARKER OTHER_MARKER FLANKING_RESTRICTION_ENZYMES COMMENTS ROW COLUMN FRP_2 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG41 pBS-TetO-op pBluescript_II_KS_PLUS bla A 1 FRP_3 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG42 pBS-LexA-op pBluescript_II_KS_PLUS bla A 2 FRP_4 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG43 pBS-TetO2-box pBluescript_II_KS_PLUS bla A 3 FRP_5 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG44 pBS-miniCyc1prom pBluescript_II_KS_PLUS bla A 4 FRP_6 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG45 pBS-LexA-DNA-BD pBluescript_II_KS_PLUS bla SV40 NLS A 5 FRP_7 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG46 pBS-tTA-DNA-BD pBluescript_II_KS_PLUS bla SV40 NLS A 6 FRP_8 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG47 pBS-VP16-AD pBluescript_II_KS_PLUS bla HA Geneva A 7 FRP_9 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG48 pBS-B42-AD pBluescript_II_KS_PLUS bla HA Geneva A 8 FRP_10 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG49 pBS-gal4-AD pBluescript_II_KS_PLUS bla A 9 FRP_11 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG50 pBS-GST pBluescript_II_KS_PLUS bla B 1 FRP_12 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG51 pBS-HBD pBluescript_II_KS_PLUS bla B 2 FRP_13 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG52 pBS-SV40NLS pBluescript_II_KS_PLUS bla B 3 FRP_14 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG53 pBS-CAAX-box pBluescript_II_KS_PLUS bla B 4 FRP_15 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG54 pBS-NES pBluescript_II_KS_PLUS bla B 5 FRP_16 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG55 pBS-HA-Geneva pBluescript_II_KS_PLUS bla B 6 FRP_17 BOX_1 /YEAST_LAB/PLASMIDS/EXP_1 ROBERT_GNUGGE pRG56 pBS-myrAnchor pBluescript_II_KS_PLUS bla B 7 FRP_18 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 1 pBSN-CFP-mKOk pBSN bla C 1 FRP_19 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 2 pBSN-CFP-Citrine pBSN bla C 2 FRP_20 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 3 pBSN-CFP-Citrine cp173 pBSN bla C 3 FRP_21 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 4 pBSN-CFP-Bcy1AB-mKOk pBSN bla C 4 FRP_22 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 5 pBSN-CFP-Nte1AB-mKOk pBSN bla C 5 FRP_23 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 6 pBSN-CFP-FHA1AKAR-mKOk pBSN bla C 6 FRP_24 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 7 pBSN-CFP-FHA1TOR-mKOk pBSN bla C 7 FRP_25 BOX_2 BOX_1:FRP_1 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 8 pBSN pBluescript_II_KS_PLUS FRP_1 bla removed NaeI site (NgoMIV,Mung Bean Nuclease) C 8 FRP_26 BOX_2 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 9 pBSN-mTfp1-mKOk pBSN bla C 9 FRP_28 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 11 pGal416N-CFP-mKOk pRS41y FRP_27 bla URA3 D 1 FRP_29 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 12 pGal416N-CFP-Bcy1AB-mKOk-1 pRS41y FRP_27 bla URA3 D 2 FRP_30 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 14 pGal416N-CFP-Nte1AB-mKOk-1 pRS41y FRP_27 bla URA3 D 3 FRP_31 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 15 pGal416N-CFP-FHA1TOR-mKOk-1 pRS41y FRP_27 bla URA3 D 4 FRP_32 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 16 pGal416N-CFP-Bcy1AB-Citrine cp173 pRS41y FRP_27 bla URA3 D 5 FRP_33 BOX_2 BOX_2:FRP_27 /YEAST_LAB/PLASMIDS/EXP_1 BEATA_MIERZWA 17 pGal416N-CFP-Bcy1AB-Citrine FAKE pRS41y FRP_1, FRP_27 bla URA3 D 6 \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/.gitignore b/plasmid/resource/jython-scripts/.gitignore deleted file mode 100644 index 2f7a3485867a0313d8d3526992315de0dc343192..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/Copy of yeast_batch_import.py diff --git a/plasmid/resource/jython-scripts/MP-chemicals_links.py b/plasmid/resource/jython-scripts/MP-chemicals_links.py deleted file mode 100644 index 875e03157f2ec5816cc89f6e73a2a1138a8deea4..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-chemicals_links.py +++ /dev/null @@ -1,201 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - concentration_list=chemical.getAttribute(ATR_CONC, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, concentration) = _extractCodeAndConcentration(chemical) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(chemical): - codeAndConcentration = chemical.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/MP-comments.py b/plasmid/resource/jython-scripts/MP-comments.py deleted file mode 100644 index c07fc5fabd409144f74d0d548798b99a0b900cb4..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-comments.py +++ /dev/null @@ -1,156 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/resource/jython-scripts/MP-media_link.py b/plasmid/resource/jython-scripts/MP-media_link.py deleted file mode 100644 index 962cc1a3e14eb169e3e3b9a473b711a0d452f09c..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-media_link.py +++ /dev/null @@ -1,213 +0,0 @@ -""" -Managed Property Script for handling MEDIA. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(medias_list, media_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - mediaPath= "/YEAST_LAB/" + medias_list - permId =entityInformationProvider().getSamplePermId(SPACE, medias_list) - if not permId: - permId = medias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, media_concentration_list) - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def updateBufferFromBatchInput(medias_list, media_concentration_list): - elements = [] - input = medias_list - input2 = media_concentration_list - if input is not None: - for i, j in zip(medias_list,media_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for media in elements: - medias_list = media.getAttribute(ATR_CODE, "") - name = media.getAttribute(ATR_NAME,"") - media_concentration_list=media.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, media, medias_list) - row.setCell(CODE_LABEL, medias_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, media_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new media, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new media relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of media, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected media relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of media sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the media sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected media relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new media element with values from input fields - and add it to existing elements. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the media element corresponding to selected row - and replace it with an element with values from input fields. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete medias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - medias = input.split(',') - for media in medias: - (code, concentration) = _extractCodeAndConcentration(media) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(media): - codeAndConcentration = media.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/MP-plasmid_parents.py b/plasmid/resource/jython-scripts/MP-plasmid_parents.py deleted file mode 100644 index 935b0eaf9e77d9a345269d618bbdf45bba44b83c..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-plasmid_parents.py +++ /dev/null @@ -1,339 +0,0 @@ -""" -Managed Property Script for handling PLASMID parents of YEAST samples. - -@author: Piotr Buczek -""" - -import re - -"""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""input pattern matching one plasmid, e.g.: -- 'FRP1 (DEL:URA3)', -- 'FRP2 (INT)', -- 'FRP3(MOD:URA3)', -- 'FRP4' -""" -INPUT_PATTERN = """ - # no '^': allow whitespace at the beginning - ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') - (\ *\( # start of 2nd group (matches an optional relationship type with annotation) - # any spaces followed by a '(' - ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') - :? # optional ':' separator - (.*) # 4th group: match annotation, any text (e.g. 'URA3') - \))? # end of 2nd (optional) group: closing bracket of relationship details - # no '$': allow whitespace at the end -""" - -""" due to some weird jython threading issue, we need to compile the pattern outside the function body """ -inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) - -"""relationship types shortcuts""" - -DEL_REL_TYPE = 'DEL' -INT_REL_TYPE = 'INT' -MOD_REL_TYPE = 'MOD' - -"""tuple of supported relationship types as shortcuts""" -REL_TYPES = (DEL_REL_TYPE, INT_REL_TYPE, MOD_REL_TYPE) -"""dictionary from relationship type shortcut to its 'character' representation""" -REL_TYPE_CHARS = { - DEL_REL_TYPE: u'\u0394', # unicode '∆' - INT_REL_TYPE: '::', - MOD_REL_TYPE: '_' -} -"""dictionary from relationship type shortcut to its full name/label""" -REL_TYPE_LABELS = { - DEL_REL_TYPE: 'deletion', - INT_REL_TYPE: 'integration', - MOD_REL_TYPE: 'modification' -} - -REL_TYPE_LABEL_OTHER = '(other)' -REL_TYPE_LABELS_WITH_NONE = tuple([REL_TYPE_LABEL_OTHER] + REL_TYPE_LABELS.values()) - -"""names of additional sample XML element attributes""" - -ATR_CODE = "code" -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - -"""labels of table columns""" - -CONNECTION_LABEL = "connection" -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _group(pattern, input): - """@return: groups returned by performing pattern search with given @pattern on given @input""" - return pattern.search(input).groups() - - -def _translateToChar(relationship): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: character representation of given @relationship, - empty string for null - '[<relationship>]' for unknown relationship - """ - if relationship: - if relationship in REL_TYPE_CHARS: - return REL_TYPE_CHARS[relationship] - else: - return "[" + relationship + "]" - else: - return "" - - -def _translateToLabel(relationship): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: full name of given @relationship, - empty string for null, - '[<relationship>]' for unknown relationship - """ - if relationship: - if relationship in REL_TYPE_LABELS: - return REL_TYPE_LABELS[relationship] - else: - return "[" + relationship + "]" - else: - return REL_TYPE_LABEL_OTHER - -def _translateFromLabel(relationshipLabel): - """ - @param relationshipLabel: relationship type as label (@see REL_TYPE_LABELS_WITH_NONE) - @return: type of given @relationshipLabel, None for REL_TYPE_LABEL_OTHER, - """ - if relationshipLabel == REL_TYPE_LABEL_OTHER: - return None - elif relationshipLabel == 'deletion': - return DEL_REL_TYPE - elif relationshipLabel == 'integration': - return INT_REL_TYPE - elif relationshipLabel == 'modification': - return MOD_REL_TYPE - -def _createConnectionString(code, relationship, annotation): - """ - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: string representation of a connection with @relationship translated to a 'character' - """ - result = code - if relationship: - result += _translateToChar(relationship) - if annotation: - result += annotation - return result - - -def _createSampleLink(code, relationship, annotation): - """ - Creates sample link XML element for sample with specified @code. The element will contain - given @code as 'code' attribute apart from standard 'permId' attribute. If specified - @relationship or @annotation are not null they will also be contained as attributes. - - If the sample doesn't exist in DB a fake link will be created with @code as permId. - - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FRP2" permId="20110309154532868-4219" relationship="DEL" annotation="URA3"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - - '<Sample code="FRP4" permId="20110309154532868-4219" relationship="INT"/>' - @raise ValidationException: if the specified relationship type is unknown - """ - permId = entityInformationProvider().getSamplePermId(SPACE, code) - if not permId: - permId = code - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, code) - if relationship: - sampleLink.addAttribute(ATR_RELATIONSHIP, relationship) - if relationship in REL_TYPES: - connectionString = _createConnectionString(code, relationship, annotation) - else: - raise ValidationException("Unknown relationship: '" + relationship + - "'. Expected one of: " + REL_TYPES) - if annotation: - sampleLink.addAttribute(ATR_ANNOTATION, annotation) - return sampleLink - -""" MAIN FUNCTIONS """ - -"""Example input: - -FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 - -Relationship types: -- DEL: deletion -- INT: integration -- MOD: modification -""" -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - plasmids = input.split(',') - for p in plasmids: - (code, g, relationship, annotation) = _group(inputPattern, p.strip()) - sampleLink = _createSampleLink(code, relationship, annotation) - elements.append(sampleLink) - - parentsInput = bindings.get(originalColumnNameBindingKey('YEAST_PARENTS')) - if parentsInput is not None: - parents = parentsInput.split(',') - for parent in parents: - permId = entityInformationProvider().getSamplePermId(SPACE, parent.strip()) - parentPlasmids = entityInformationProvider().getSamplePropertyValue(permId, 'PLASMIDS') - if parentPlasmids is None: - continue - parentElements = list(propertyConverter().convertStringToElements(parentPlasmids)) - for parentLink in parentElements: - elements.append(parentLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CONNECTION_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(RELATIONSHIP_LABEL) - tableBuilder.addHeader(ANNOTATION_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plasmid in elements: - code = plasmid.getAttribute(ATR_CODE, "") - relationship = plasmid.getAttribute(ATR_RELATIONSHIP, "") - annotation = plasmid.getAttribute(ATR_ANNOTATION, "") - - row = tableBuilder.addRow() - row.setCell(CONNECTION_LABEL, _createConnectionString(code, relationship, annotation)) - row.setCell(LINK_LABEL, plasmid, code) - row.setCell(CODE_LABEL, code) - row.setCell(RELATIONSHIP_LABEL, _translateToLabel(relationship)) - row.setCell(ANNOTATION_LABEL, annotation) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new plasmid relationship, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plasmid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRP')\ - .setDescription('Code of plasmid sample, e.g. "FRP1"'), - inputWidgetFactory().createComboBoxInputField(RELATIONSHIP_LABEL, REL_TYPE_LABELS_WITH_NONE)\ - .setMandatory(False)\ - .setValue(REL_TYPE_LABEL_OTHER), - inputWidgetFactory().createTextInputField(ANNOTATION_LABEL)\ - .setMandatory(False)\ - .setDescription('Relationship annotation, e.g. "URA3"'), - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected plasmid relationship, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plasmid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of plasmid sample, e.g. "FRP1"'), - inputWidgetFactory().createComboBoxInputField(RELATIONSHIP_LABEL, REL_TYPE_LABELS_WITH_NONE)\ - .setMandatory(False), - inputWidgetFactory().createTextInputField(ANNOTATION_LABEL)\ - .setMandatory(False)\ - .setDescription('Relationship annotation, e.g. "URA3"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(RELATIONSHIP_LABEL, RELATIONSHIP_LABEL) - editAction.addBinding(ANNOTATION_LABEL, ANNOTATION_LABEL) - - """ - 3. delete selected plasmid relationships. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected plasmid relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new plasmid relationship element with values from input fields - and add it to existing elements. - """ - code = action.getInputValue(CODE_LABEL) - relationshipLabel = action.getInputValue(RELATIONSHIP_LABEL) - relationship = _translateFromLabel(relationshipLabel) - annotation = action.getInputValue(ANNOTATION_LABEL) - sampleLink = _createSampleLink(code, relationship, annotation) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the plasmid relationship element corresponding to selected row - and replace it with an element with values from input fields. - """ - code = action.getInputValue(CODE_LABEL) - relationshipLabel = action.getInputValue(RELATIONSHIP_LABEL) - relationship = _translateFromLabel(relationshipLabel) - annotation = action.getInputValue(ANNOTATION_LABEL) - sampleLink = _createSampleLink(code, relationship, annotation) - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the relationships that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) diff --git a/plasmid/resource/jython-scripts/MP-solutions_buffers_links.py b/plasmid/resource/jython-scripts/MP-solutions_buffers_links.py deleted file mode 100644 index 8d304ff46fe134af7e89fe8b6a5537edfedecbb1..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-solutions_buffers_links.py +++ /dev/null @@ -1,213 +0,0 @@ -""" -Managed Property Script for handling SOLUTIONS BUFFERS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(buffers_list, buffer_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bufferPath= "/YEAST_LAB/" + buffers_list - permId =entityInformationProvider().getSamplePermId(SPACE, buffers_list) - if not permId: - permId = buffers_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffer_concentration_list) - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def updateBufferFromBatchInput(buffers_list, buffer_concentration_list): - elements = [] - input = buffers_list - input2 = buffer_concentration_list - if input is not None: - for i, j in zip(buffers_list,buffer_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(CONC_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for buffer in elements: - buffers_list = buffer.getAttribute(ATR_CODE, "") - name = buffer.getAttribute(ATR_NAME,"") - buffer_concentration_list=buffer.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, buffer, buffers_list) - row.setCell(CODE_LABEL, buffers_list) - row.setCell(NAME_LABEL,name) - row.setCell(CONC_LABEL, buffer_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new buffer, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new buffer relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of buffer, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected buffer relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of buffer sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the buffer sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected buffer relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new buffer element with values from input fields - and add it to existing elements. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the buffer element corresponding to selected row - and replace it with an element with values from input fields. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete buffers that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - buffers = input.split(',') - for buffer in buffers: - (code, concentration) = _extractCodeAndConcentration(buffer) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(buffer): - codeAndConcentration = buffer.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/MP-yeast_parents.py b/plasmid/resource/jython-scripts/MP-yeast_parents.py deleted file mode 100644 index e4dce29e9b489aef2a1bb17c94caf9e3b487d869..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/MP-yeast_parents.py +++ /dev/null @@ -1,182 +0,0 @@ -""" -Managed Property Script for handling YEAST parents of YEAST samples. - -@author: Piotr Buczek -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""plasmid_list attribute name""" -ATR_CODE = "code" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(plasmid_list): - """ - Creates sample link XML element for sample with specified 'plasmid_list'. The element will contain - given plasmid_list as 'plasmid_list' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'plasmid_list' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample plasmid_list="FRP1" permId="20110309154532868-4219"/>' - - '<Sample plasmid_list="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - plasmidPath= "/YEAST_LAB/" + plasmid_list - permId = entityInformationProvider().getSamplePermId(SPACE, plasmid_list) - if not permId: - permId = plasmid_list - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, plasmid_list) - - return sampleLink - - -""" -Example input: - -FRY1, FRY2, FRY3, FRY4 -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - plasmid_list = item.get('CODE') - sampleLink = _createSampleLink(plasmid_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - samples = input.split(',') - for plasmid_list in samples: - sampleLink = _createSampleLink(plasmid_list.strip()) - elements.append(sampleLink) - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plasmid in elements: - plasmid_list = plasmid.getAttribute(ATR_CODE, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, plasmid, plasmid_list) - row.setCell(CODE_LABEL, plasmid_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new yeast parent, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plasmid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRY')\ - .setDescription('Code of yeast parent sample, e.g. "FRY1"') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plasmid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of yeast parent sample, e.g. "FRY1"') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected yeast parent relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new yeast parent element with values from input fields - and add it to existing elements. - """ - plasmid_list = action.getInputValue(CODE_LABEL) - sampleLink = _createSampleLink(plasmid_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the yeast parent element corresponding to selected row - and replace it with an element with values from input fields. - """ - plasmid_list = action.getInputValue(CODE_LABEL) - sampleLink = _createSampleLink(plasmid_list) - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete yeast parents that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/Western_blotting_script.py b/plasmid/resource/jython-scripts/Western_blotting_script.py deleted file mode 100644 index 5e0b698152bd15d6dce10834e2407cd9d6521c7c..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/Western_blotting_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling WB samples. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(wbs_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - wbPath= "/YLAB-TEST/" + wbs_list - permId =entityInformationProvider().getSamplePermId(SPACE, wbs_list) - if not permId: - permId = wbs_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, wbs_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - wbs_list = item.get('CODE') - comment_list = item.get('COMMENT') - if wbs_list: - sampleLink = _createSampleLink(wbs_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for wb in elements: - wbs_list = wb.getAttribute(ATR_CODE, "") - name = wb.getAttribute(ATR_NAME,"") - comment_list=wb.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, wb, wbs_list) - row.setCell(CODE_LABEL, wbs_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new wb, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new wb relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRWB')\ - .setDescription('Code of wb, e.g. "FRWB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected wb relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of wb sample, e.g. "FRWB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected wb relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new wb element with values from input fields - and add it to existing elements. - """ - wbs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(wbs_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the wb element corresponding to selected row - and replace it with an element with values from input fields. - """ - wbs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(wbs_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete wbs that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - wbs = input.split(',') - for wb in wbs: - (code, comment) = _extractCodeAndComment(wb) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(wb): - codeAndComment = wb.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/antibodies_script.py b/plasmid/resource/jython-scripts/antibodies_script.py deleted file mode 100644 index 2031dc7df7456c9ab7da5ac6da9ed4b9fc0707f8..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/antibodies_script.py +++ /dev/null @@ -1,234 +0,0 @@ -""" -Managed Property Script for handling General Antibodies. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_QUANTITY = "quantity" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -QUANTITY_LABEL = "quantity" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(antibodies_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - antibodyPath= "/YEAST_LAB/" + antibodies_list - permId =entityInformationProvider().getSamplePermId(SPACE, antibodies_list) - if not permId: - permId = antibodies_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, antibodies_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - antibodies_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if antibodies_list: - sampleLink = _createSampleLink(antibodies_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for antibody in elements: - antibodies_list = antibody.getAttribute(ATR_CODE, "") - name = antibody.getAttribute(ATR_NAME,"") - quantity_list=antibody.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, antibody, antibodies_list) - row.setCell(CODE_LABEL, antibodies_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new antibody, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new antibody relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRAB')\ - .setDescription('Code of antibody, e.g. "FRAB1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected antibody relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of antibody sample, e.g. "FRAB1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected antibody relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new antibody element with values from input fields - and add it to existing elements. - """ - antibodies_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(antibodies_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the antibody element corresponding to selected row - and replace it with an element with values from input fields. - """ - antibodies_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - sampleLink = _createSampleLink(antibodies_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete antibodies that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -#def updateFromBatchInput(bindings): -# elements = [] -# input = bindings.get('') -# if input is not None: -# commentEntry = _createCommentEntry(input) -# elements.append(commentEntry) -# property.value = propertyConverter().convertToString(elements) - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - antibodies = input.split(',') - for antibody in antibodies: - (code, quantity) = _extractCodeAndQuantity(antibody) - commentEntry = _createCommentEntry(input) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink, commentEntry) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(antibody): - codeAndQuantity = chemical.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/bacteria_script.py b/plasmid/resource/jython-scripts/bacteria_script.py deleted file mode 100644 index 48d750b6ebfdc3e053fef6a2ac3491fdfcede0cd..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/bacteria_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(bacterias_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bacteriaPath= "/YLAB-TEST/" + bacterias_list - permId =entityInformationProvider().getSamplePermId(SPACE, bacterias_list) - if not permId: - permId = bacterias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, bacterias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - bacterias_list = item.get('CODE') - comment_list = item.get('COMMENT') - if bacterias_list: - sampleLink = _createSampleLink(bacterias_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for bacteria in elements: - bacterias_list = bacteria.getAttribute(ATR_CODE, "") - name = bacteria.getAttribute(ATR_NAME,"") - comment_list=bacteria.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, bacteria, bacterias_list) - row.setCell(CODE_LABEL, bacterias_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new bacteria, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new bacteria relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRB')\ - .setDescription('Code of bacteria, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected bacteria relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of bacteria sample, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected bacteria relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new bacteria element with values from input fields - and add it to existing elements. - """ - bacterias_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(bacterias_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the bacteria element corresponding to selected row - and replace it with an element with values from input fields. - """ - bacterias_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(bacterias_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete bacterias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - bacterias = input.split(',') - for bacteria in bacterias: - (code, comment) = _extractCodeAndComment(bacteria) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(bacteria): - codeAndComment = bacteria.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/chemicals_links.py b/plasmid/resource/jython-scripts/chemicals_links.py deleted file mode 100644 index 02387d72505a0c157ec66447e17a7e0a185afefd..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/chemicals_links.py +++ /dev/null @@ -1,220 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - chemicals_list = item.get('CODE') - concentration_list = item.get('CONCENTRATION') - if chemicals_list: - sampleLink = _createSampleLink(chemicals_list, concentration_list) - elements.append(sampleLink) - - - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - concentration_list=chemical.getAttribute(ATR_CONC, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, concentration) = _extractCodeAndConcentration(chemical) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(chemical): - codeAndConcentration = chemical.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/chemicals_quantity_links.py b/plasmid/resource/jython-scripts/chemicals_quantity_links.py deleted file mode 100644 index 8c64df4dce3282634ec22d6b0f29d793a4251abf..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/chemicals_quantity_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - chemicals_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if chemicals_list: - sampleLink = _createSampleLink(chemicals_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - quantity_list=chemical.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(chemicals_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, quantity) = _extractCodeAndQuantity(chemical) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(chemical): - codeAndQuantity = chemical.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/comments.py b/plasmid/resource/jython-scripts/comments.py deleted file mode 100644 index 02c50d2364afd8bf0dce2d50297c6bff2ccb35bf..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/comments.py +++ /dev/null @@ -1,174 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [COMMENT_ENTRY_ELEMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - comment_text_list = item.get('COMMENTENTRY') - sampleLink = _createCommentEntry(comment_text_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/resource/jython-scripts/enzymes_script.py b/plasmid/resource/jython-scripts/enzymes_script.py deleted file mode 100644 index a437958c0bf604299f7c5d97721d8bf23272fec7..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/enzymes_script.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling ENZYMES. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB"F - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONCENTRATION = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONCENTRATION_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(enzymes_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - enzymePath= "/YEAST_LAB/" + enzymes_list - permId =entityInformationProvider().getSamplePermId(SPACE, enzymes_list) - if not permId: - permId = enzymes_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, enzymes_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONCENTRATION, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONCENTRATION_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - enzymes_list = item.get('CODE') - concentration_list = item.get('CONCENTRATION') - if enzymes_list: - sampleLink = _createSampleLink(enzymes_list, concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONCENTRATION_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for enzyme in elements: - enzymes_list = enzyme.getAttribute(ATR_CODE, "") - name = enzyme.getAttribute(ATR_NAME,"") - concentration_list=enzyme.getAttribute(ATR_CONCENTRATION, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, enzyme, enzymes_list) - row.setCell(CODE_LABEL, enzymes_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONCENTRATION_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new enzyme, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new enzyme relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of enzyme, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONCENTRATION_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected enzyme relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of enzyme sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONCENTRATION_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the enzyme sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONCENTRATION_LABEL, CONCENTRATION_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected enzyme relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new enzyme element with values from input fields - and add it to existing elements. - """ - enzymes_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONCENTRATION_LABEL) - sampleLink = _createSampleLink(enzymes_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the enzyme element corresponding to selected row - and replace it with an element with values from input fields. - """ - enzymes_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONCENTRATION_LABEL) - - - - sampleLink = _createSampleLink(enzymes_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete enzymes that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - enzymes = input.split(',') - for enzyme in enzymes: - (code, concentration) = _extractCodeAndConcentration(enzyme) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(enzyme): - codeAndConcentration = enzyme.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/generic_annotations.py b/plasmid/resource/jython-scripts/generic_annotations.py deleted file mode 100644 index 3625b9e3dcb618d93be558ff7b13ec62cfa41440..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/generic_annotations.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Managed Property Script for links to samples with concentration, quantity, details - - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_DETAIL = "detail" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" -DETAIL_LABEL = "details" - - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(entities_list, quantity_list, detail_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - entityPath= "/YEAST_LAB/" + entities_list - permId =entityInformationProvider().getSamplePermId(SPACE, entities_list) - if not permId: - permId = entities_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, entities_list) - sampleLink.addAttribute(ATR_NAME, name) - if not quantity_list: - quantity_list = ' ' - if not detail_list: - detail_list=' ' - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - sampleLink.addAttribute(ATR_DETAIL, detail_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL, DETAIL_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - entities_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - detail_list = item.get('DETAIL') - if entities_list: - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(DETAIL_LABEL) - - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for entity in elements: - entities_list = entity.getAttribute(ATR_CODE, "") - name = entity.getAttribute(ATR_NAME,"") - quantity_list=entity.getAttribute(ATR_QUANTITY, "") - detail_list=entity.getAttribute(ATR_DETAIL, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, entity, entities_list) - row.setCell(CODE_LABEL, entities_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - row.setCell(DETAIL_LABEL, detail_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new entity, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new entity relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FR')\ - .setDescription('Code of entity, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(False)\ - .setDescription('Quantity'), - inputWidgetFactory().createMultilineTextInputField(DETAIL_LABEL)\ - .setMandatory(False)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected entity relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of entity sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(False)\ - .setDescription('Quantity of the entity sample, e.g. "1M"'), - inputWidgetFactory().createMultilineTextInputField(DETAIL_LABEL)\ - .setMandatory(False)\ - .setDescription('Comment') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - editAction.addBinding(DETAIL_LABEL, DETAIL_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected entity relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new entity element with values from input fields - and add it to existing elements. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - detail_list = action.getInputValue(DETAIL_LABEL) - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the entity element corresponding to selected row - and replace it with an element with values from input fields. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - detail_list = action.getInputValue(DETAIL_LABEL) - - - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete entities that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - entities = input.split(',') - for entity in entities: - (code, quantity, detail) = _extractCodeAndQuantity(entity) -# sampleLink = _createSampleLink(code, quantity, concentration) - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(entity): - codeAndQuantity = entity.split(':') - if (len(codeAndQuantity) == 3): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip(), codeAndQuantity[2].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/generic_concentration_links.py b/plasmid/resource/jython-scripts/generic_concentration_links.py deleted file mode 100644 index 02387d72505a0c157ec66447e17a7e0a185afefd..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/generic_concentration_links.py +++ /dev/null @@ -1,220 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - chemicals_list = item.get('CODE') - concentration_list = item.get('CONCENTRATION') - if chemicals_list: - sampleLink = _createSampleLink(chemicals_list, concentration_list) - elements.append(sampleLink) - - - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - concentration_list=chemical.getAttribute(ATR_CONC, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, concentration) = _extractCodeAndConcentration(chemical) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(chemical): - codeAndConcentration = chemical.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/generic_quantity_links.py b/plasmid/resource/jython-scripts/generic_quantity_links.py deleted file mode 100644 index b4a7848566d5c829f87ec633a5f53431841793e1..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/generic_quantity_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for links to samples with quantity - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(entities_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - entityPath= "/YEAST_LAB/" + entities_list - permId =entityInformationProvider().getSamplePermId(SPACE, entities_list) - if not permId: - permId = entities_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, entities_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - entities_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if entities_list: - sampleLink = _createSampleLink(entities_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for entity in elements: - entities_list = entity.getAttribute(ATR_CODE, "") - name = entity.getAttribute(ATR_NAME,"") - quantity_list=entity.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, entity, entities_list) - row.setCell(CODE_LABEL, entities_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new entity, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new entity relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of entity, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected entity relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of entity sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the entity sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected entity relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new entity element with values from input fields - and add it to existing elements. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(entities_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the entity element corresponding to selected row - and replace it with an element with values from input fields. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(entities_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete entities that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - entities = input.split(',') - for entity in entities: - (code, quantity) = _extractCodeAndQuantity(entity) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(entity): - codeAndQuantity = entity.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/resource/jython-scripts/media_link.py b/plasmid/resource/jython-scripts/media_link.py deleted file mode 100644 index 5a2521525dfe1a4a70e655a25b4245bdac52e3cc..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/media_link.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling MEDIA. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(medias_list, media_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - mediaPath= "/YEAST_LAB/" + medias_list - permId =entityInformationProvider().getSamplePermId(SPACE, medias_list) - if not permId: - permId = medias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, media_concentration_list) - return sampleLink - - -""" -Example input: - -FRM1:2nM, FRM2, FRM3:3 nM -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - medias_list = item.get('CODE') - media_concentration_list = item.get('CONCENTRATION') - if medias_list: - sampleLink = _createSampleLink(medias_list, media_concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for media in elements: - medias_list = media.getAttribute(ATR_CODE, "") - name = media.getAttribute(ATR_NAME,"") - media_concentration_list=media.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, media, medias_list) - row.setCell(CODE_LABEL, medias_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, media_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new media, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new media relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRM')\ - .setDescription('Code of media, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected media relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of media sample, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the media sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected media relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new media element with values from input fields - and add it to existing elements. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the media element corresponding to selected row - and replace it with an element with values from input fields. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete medias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - medias = input.split(',') - for media in medias: - (code, concentration) = _extractCodeAndConcentration(media) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(media): - codeAndConcentration = media.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/media_quantity_link.py b/plasmid/resource/jython-scripts/media_quantity_link.py deleted file mode 100644 index 8cab84c9427ae57a58d20896e7b2c2396628a386..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/media_quantity_link.py +++ /dev/null @@ -1,219 +0,0 @@ -""" -Managed Property Script for handling MEDIA. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(medias_list, media_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - mediaPath= "/YEAST_LAB/" + medias_list - permId =entityInformationProvider().getSamplePermId(SPACE, medias_list) - if not permId: - permId = medias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, media_quantity_list) - return sampleLink - - -""" -Example input: - -FRM1:2nM, FRM2, FRM3:3 nM -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - medias_list = item.get('CODE') - media_quantity_list = item.get('QUANTITY') - if medias_list: - sampleLink = _createSampleLink(medias_list, media_quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for media in elements: - medias_list = media.getAttribute(ATR_CODE, "") - name = media.getAttribute(ATR_NAME,"") - media_quantity_list=media.getAttribute(ATR_QUANTITY, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, media, medias_list) - row.setCell(CODE_LABEL, medias_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, media_quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new media, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new media relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRM')\ - .setDescription('Code of media, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected media relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of media sample, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the media sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected media relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new media element with values from input fields - and add it to existing elements. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(medias_list, media_quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the media element corresponding to selected row - and replace it with an element with values from input fields. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(medias_list, media_quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete medias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - medias = input.split(',') - for media in medias: - (code, quantity) = _extractCodeAndQuantity(media) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(media): - codeAndQuantity = media.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/oligo_script.py b/plasmid/resource/jython-scripts/oligo_script.py deleted file mode 100644 index a39c299bbbd90d94798b6e9bab31f713d3348449..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/oligo_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(oligos_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - oligoPath= "/YLAB-TEST/" + oligos_list - permId =entityInformationProvider().getSamplePermId(SPACE, oligos_list) - if not permId: - permId = oligos_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, oligos_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - oligos_list = item.get('CODE') - comment_list = item.get('COMMENT') - if oligos_list: - sampleLink = _createSampleLink(oligos_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for oligo in elements: - oligos_list = oligo.getAttribute(ATR_CODE, "") - name = oligo.getAttribute(ATR_NAME,"") - comment_list=oligo.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, oligo, oligos_list) - row.setCell(CODE_LABEL, oligos_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new oligo, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new oligo relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRB')\ - .setDescription('Code of oligo, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected oligo relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of oligo sample, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected oligo relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new oligo element with values from input fields - and add it to existing elements. - """ - oligos_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(oligos_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the oligo element corresponding to selected row - and replace it with an element with values from input fields. - """ - oligos_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(oligos_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete oligos that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - oligos = input.split(',') - for oligo in oligos: - (code, comment) = _extractCodeAndComment(oligo) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(oligo): - codeAndComment = oligo.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/pcr_script.py b/plasmid/resource/jython-scripts/pcr_script.py deleted file mode 100644 index c236c1ab02f18aa8016c1d99b40d522c1f4169af..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/pcr_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling PCR samples. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(pcrs_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - pcrPath= "/YLAB-TEST/" + pcrs_list - permId =entityInformationProvider().getSamplePermId(SPACE, pcrs_list) - if not permId: - permId = pcrs_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pcrs_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - pcrs_list = item.get('CODE') - comment_list = item.get('COMMENT') - if pcrs_list: - sampleLink = _createSampleLink(pcrs_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for pcr in elements: - pcrs_list = pcr.getAttribute(ATR_CODE, "") - name = pcr.getAttribute(ATR_NAME,"") - comment_list=pcr.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, pcr, pcrs_list) - row.setCell(CODE_LABEL, pcrs_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new pcr, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new pcr relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRPCR')\ - .setDescription('Code of pcr, e.g. "FRPCR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected pcr relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of pcr sample, e.g. "FRPCR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected pcr relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new pcr element with values from input fields - and add it to existing elements. - """ - pcrs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(pcrs_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the pcr element corresponding to selected row - and replace it with an element with values from input fields. - """ - pcrs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(pcrs_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete pcrs that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - pcrs = input.split(',') - for pcr in pcrs: - (code, comment) = _extractCodeAndComment(pcr) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(pcr): - codeAndComment = pcr.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/plasmid_script.py b/plasmid/resource/jython-scripts/plasmid_script.py deleted file mode 100644 index 6ae7be4fe47ea4f8b34e22d9d12afd29245f2264..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/plasmid_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(plamsids_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - plamsidPath= "/YLAB-TEST/" + plamsids_list - permId =entityInformationProvider().getSamplePermId(SPACE, plamsids_list) - if not permId: - permId = plamsids_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, plamsids_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - plamsids_list = item.get('CODE') - comment_list = item.get('COMMENT') - if plamsids_list: - sampleLink = _createSampleLink(plamsids_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plamsid in elements: - plamsids_list = plamsid.getAttribute(ATR_CODE, "") - name = plamsid.getAttribute(ATR_NAME,"") - comment_list=plamsid.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, plamsid, plamsids_list) - row.setCell(CODE_LABEL, plamsids_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new plamsid, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plamsid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRP')\ - .setDescription('Code of plamsid, e.g. "FRP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plamsid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of plamsid sample, e.g. "FRP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected plamsid relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new plamsid element with values from input fields - and add it to existing elements. - """ - plamsids_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(plamsids_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the plamsid element corresponding to selected row - and replace it with an element with values from input fields. - """ - plamsids_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(plamsids_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete plamsids that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - plamsids = input.split(',') - for plamsid in plamsids: - (code, comment) = _extractCodeAndComment(plamsid) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(plamsid): - codeAndComment = plamsid.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/pombe_script.py b/plasmid/resource/jython-scripts/pombe_script.py deleted file mode 100644 index 91e1baebd09cfed9030716909c0e98a6e6f5fc78..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/pombe_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(pombes_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - pombePath= "/YLAB-TEST/" + pombes_list - permId =entityInformationProvider().getSamplePermId(SPACE, pombes_list) - if not permId: - permId = pombes_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pombes_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - pombes_list = item.get('CODE') - comment_list = item.get('COMMENT') - if pombes_list: - sampleLink = _createSampleLink(pombes_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for pombe in elements: - pombes_list = pombe.getAttribute(ATR_CODE, "") - name = pombe.getAttribute(ATR_NAME,"") - comment_list=pombe.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, pombe, pombes_list) - row.setCell(CODE_LABEL, pombes_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new pombe, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new pombe relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRSP')\ - .setDescription('Code of pombe, e.g. "FRSP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected pombe relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of pombe sample, e.g. "FRSP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected pombe relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new pombe element with values from input fields - and add it to existing elements. - """ - pombes_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(pombes_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the pombe element corresponding to selected row - and replace it with an element with values from input fields. - """ - pombes_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(pombes_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete pombes that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - pombes = input.split(',') - for pombe in pombes: - (code, comment) = _extractCodeAndComment(pombe) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(pombe): - codeAndComment = pombe.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/protocols_script.py b/plasmid/resource/jython-scripts/protocols_script.py deleted file mode 100644 index 72e5fceac4344e03d470b08929c8807e4a808d3b..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/protocols_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling General Protocols. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(protocols_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - protocolPath= "/YLAB-TEST/" + protocols_list - permId =entityInformationProvider().getSamplePermId(SPACE, protocols_list) - if not permId: - permId = protocols_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, protocols_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - protocols_list = item.get('CODE') - comment_list = item.get('COMMENT') - if protocols_list: - sampleLink = _createSampleLink(protocols_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for protocol in elements: - protocols_list = protocol.getAttribute(ATR_CODE, "") - name = protocol.getAttribute(ATR_NAME,"") - comment_list=protocol.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, protocol, protocols_list) - row.setCell(CODE_LABEL, protocols_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new protocol, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new protocol relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRPROT')\ - .setDescription('Code of protocol, e.g. "FRPROT1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected protocol relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of protocol sample, e.g. "FRPROT1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected protocol relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new protocol element with values from input fields - and add it to existing elements. - """ - protocols_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(protocols_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the protocol element corresponding to selected row - and replace it with an element with values from input fields. - """ - protocols_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(protocols_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete protocols that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - protocols = input.split(',') - for protocol in protocols: - (code, comment) = _extractCodeAndComment(protocol) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(protocol): - codeAndComment = protocol.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/readout_script.py b/plasmid/resource/jython-scripts/readout_script.py deleted file mode 100644 index d645772e58338333f59d03ded728c979260b8ad7..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/readout_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(readouts_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - readoutPath= "/YLAB-TEST/" + readouts_list - permId =entityInformationProvider().getSamplePermId(SPACE, readouts_list) - if not permId: - permId = readouts_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, readouts_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - readouts_list = item.get('CODE') - comment_list = item.get('COMMENT') - if readouts_list: - sampleLink = _createSampleLink(readouts_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for readout in elements: - readouts_list = readout.getAttribute(ATR_CODE, "") - name = readout.getAttribute(ATR_NAME,"") - comment_list=readout.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, readout, readouts_list) - row.setCell(CODE_LABEL, readouts_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new readout, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new readout relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRR')\ - .setDescription('Code of readout, e.g. "FRR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected readout relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of readout sample, e.g. "FRR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected readout relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new readout element with values from input fields - and add it to existing elements. - """ - readouts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(readouts_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the readout element corresponding to selected row - and replace it with an element with values from input fields. - """ - readouts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(readouts_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete readouts that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - readouts = input.split(',') - for readout in readouts: - (code, comment) = _extractCodeAndComment(readout) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(readout): - codeAndComment = readout.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/solution_buffers_quantity_links.py b/plasmid/resource/jython-scripts/solution_buffers_quantity_links.py deleted file mode 100644 index 3f2de5a370906c4fb9b48bb0fa8a960ca279e625..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/solution_buffers_quantity_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling SOLUTIONS BUFFERS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(buffers_list, buffer_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bufferPath= "/YEAST_LAB/" + buffers_list - permId =entityInformationProvider().getSamplePermId(SPACE, buffers_list) - if not permId: - permId = buffers_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, buffer_quantity_list) - return sampleLink - - -""" -Example input: - -FRSOB1: 1nM, FRSOB2, FRSOB3: 3nM -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - buffers_list = item.get('CODE') - buffer_quantity_list = item.get('QUANTITY') - if buffers_list: - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for buffer in elements: - buffers_list = buffer.getAttribute(ATR_CODE, "") - name = buffer.getAttribute(ATR_NAME,"") - buffer_quantity_list=buffer.getAttribute(ATR_QUANTITY, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, buffer, buffers_list) - row.setCell(CODE_LABEL, buffers_list) - row.setCell(NAME_LABEL,name) - row.setCell(QUANTITY_LABEL, buffer_quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new buffer, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new buffer relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of buffer, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected buffer relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of buffer sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the buffer sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected buffer relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new buffer element with values from input fields - and add it to existing elements. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the buffer element corresponding to selected row - and replace it with an element with values from input fields. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete buffers that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - buffers = input.split(',') - for buffer in buffers: - (code, quantity) = _extractCodeAndQuantity(buffer) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(buffer): - codeAndQuantity = buffer.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/solutions_buffers_links.py b/plasmid/resource/jython-scripts/solutions_buffers_links.py deleted file mode 100644 index 34501031b8140dd2bc6b2edfe9a97bf0a4acf949..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/solutions_buffers_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling SOLUTIONS BUFFERS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(buffers_list, buffer_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bufferPath= "/YEAST_LAB/" + buffers_list - permId =entityInformationProvider().getSamplePermId(SPACE, buffers_list) - if not permId: - permId = buffers_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffer_concentration_list) - return sampleLink - - -""" -Example input: - -FRSOB1: 3nM, FRSOB2, FRSOB3: 4nM -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - buffers_list = item.get('CODE') - buffers_concentration_list = item.get('CONCENTRATION') - if buffers_list: - sampleLink = _createSampleLink(buffers_list, buffers_concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(CONC_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for buffer in elements: - buffers_list = buffer.getAttribute(ATR_CODE, "") - name = buffer.getAttribute(ATR_NAME,"") - buffer_concentration_list=buffer.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, buffer, buffers_list) - row.setCell(CODE_LABEL, buffers_list) - row.setCell(NAME_LABEL,name) - row.setCell(CONC_LABEL, buffer_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new buffer, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new buffer relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of buffer, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected buffer relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of buffer sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the buffer sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected buffer relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new buffer element with values from input fields - and add it to existing elements. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the buffer element corresponding to selected row - and replace it with an element with values from input fields. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete buffers that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - buffers = input.split(',') - for buffer in buffers: - (code, concentration) = _extractCodeAndConcentration(buffer) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(buffer): - codeAndConcentration = buffer.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/resource/jython-scripts/yeast_script.py b/plasmid/resource/jython-scripts/yeast_script.py deleted file mode 100644 index 98428a0c4ff9acc9d1b80f742b74f5bc9871c949..0000000000000000000000000000000000000000 --- a/plasmid/resource/jython-scripts/yeast_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(yeasts_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - yeastPath= "/YLAB-TEST/" + yeasts_list - permId =entityInformationProvider().getSamplePermId(SPACE, yeasts_list) - if not permId: - permId = yeasts_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, yeasts_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - yeasts_list = item.get('CODE') - comment_list = item.get('COMMENT') - if yeasts_list: - sampleLink = _createSampleLink(yeasts_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for yeast in elements: - yeasts_list = yeast.getAttribute(ATR_CODE, "") - name = yeast.getAttribute(ATR_NAME,"") - comment_list=yeast.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, yeast, yeasts_list) - row.setCell(CODE_LABEL, yeasts_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new yeast, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new yeast relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRY')\ - .setDescription('Code of yeast, e.g. "FRY1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected yeast relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of yeast sample, e.g. "FRY1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected yeast relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new yeast element with values from input fields - and add it to existing elements. - """ - yeasts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(yeasts_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the yeast element corresponding to selected row - and replace it with an element with values from input fields. - """ - yeasts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(yeasts_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete yeasts that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - yeasts = input.split(',') - for yeast in yeasts: - (code, comment) = _extractCodeAndComment(yeast) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(yeast): - codeAndComment = yeast.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/settings.gradle b/plasmid/settings.gradle deleted file mode 100644 index 33440dae995c32d3e498e18b39ed5c1e0f9af0b5..0000000000000000000000000000000000000000 --- a/plasmid/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', 'datastore_server' diff --git a/plasmid/source-lsi/html/bacteria-body-style.css b/plasmid/source-lsi/html/bacteria-body-style.css deleted file mode 100644 index 58062763117ba1639f7e081080175b12478c4612..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/bacteria-body-style.css +++ /dev/null @@ -1,49 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - - - -/* Table */ - - -.bacteria-table-data-cell { - overflow: hidden; - -} - - -#bacteria-table tr:nth-child(odd) td{ - background-color:#DC7E9E; -} - - -#bacteria-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - - - -#bacteria-table td{ - -padding:5px; -} - -#bacteria-table tr.bacteria-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#6E3F4F; - -} - - - - diff --git a/plasmid/source-lsi/html/bacteria-browser.html b/plasmid/source-lsi/html/bacteria-browser.html deleted file mode 100644 index a3cc315e1f46f3f4a9fa9071364f7461347d3f94..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/bacteria-browser.html +++ /dev/null @@ -1,681 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Bacteria Browser</title> - <link type="text/css" rel="stylesheet" href="bacteria-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - - -// Some global variables we refer to - -/// All bacteria -var bacteria = null; - -/// The bacteria that are currently being inspected -var inspectedBacteria = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["CULTURE_TYPE", "PLASMID"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - bacteria = objectOrId; - } else { - bacteria = bacteriaById[objectOrId]; - } - - return bacteria; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the bacteria variable */ -function initializeBacteria(result) -{ - // Construct a map of all bacteria by id - bacteriaById = {}; - - // Split the bacteria into two groups, the ones that start with FRP in their sample name and the other ones. - var frpBacteria = [], otherBacteria = []; - var frpRegex = /^B[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - bacteriaById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the bacteriaById map - theSample = bacteriaById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpBacteria.push(theSample); - } else { - otherBacteria.push(theSample); - } - }); - - // Sort each of the groups - otherBacteria.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpBacteria.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of bacteria - bacteria = frpBacteria.concat(otherBacteria); -} - -/** Set the size of the bacteria-table based on whether or not inspectors are visible */ -function resizeBacteriaTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedBacteria.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var bacteriaTableTransition = d3.selectAll('div.bacteria-table-data-cell'); - bacteriaTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectBacteria(bacteria) -{ - if (inspectedBacteria.indexOf(bacteria) < 0) { - inspectedBacteria.push(bacteria); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var bacteriaToSend = $.extend({}, bacteria); - delete bacteriaToSend.parents; - delete bacteriaToSend.children; - openbisServer.listDataSetsForSample(bacteriaToSend, true, dataset.curry(bacteria)); - } - resizeBacteriaTable(); - updateInspectors(1000); -} - -function closeInspector(bacteria) -{ - var index = inspectedBacteria.indexOf(bacteria); - if (index < 0) { - return; - } - - inspectedBacteria.splice(index, 1); - resizeBacteriaTable(); - updateInspectors(1000); -} - -function dataset(bacteria, data) { - for (var i in data.result) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(bacteria, data.result[i])); - } -} - -function filelist(bacteria, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+bacteria.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - var downloadUrl = 'https://openbis-lsi.ethz.ch:8444/datastore_server/'+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.sessionToken; - - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedBacteria, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectBacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectBacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeBacteria(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (bacteria.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacteria); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "bacteria-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.PLASMID, sample.properties.CULTURE_TYPE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "bacteria-table-data-cell") - .text(String) - -} - -function bacteriaFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(plasmidFilterText, cultureFilterText) -{ - if (plasmidFilterText == undefined) - { - plasmidFilterText = ""; - } - - if (cultureFilterText == undefined) - { - cultureFilterText = ""; - } - - - var displayedBacteria = bacteria.filter(bacteriaFilter.curry(plasmidFilterText, "PLASMID")); - displayedBacteria = displayedBacteria.filter(bacteriaFilter.curry(cultureFilterText, "CULTURE_TYPE")); - - - - - var selection2 = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacteria); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedBacteria) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "BACTERIA" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#plasmid_filter').keyup(function() { - visualize($('#plasmid_filter').val(), $('#culture_filter').val()); - }); - - $('#culture_filter').keyup(function() { - visualize($('#plasmid_filter').val(), $('#culture_filter').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Oligos </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - -<!-- Not needed for now, but already implemented in case it will be needed in future, as database grows - <div id="filter-button" style="padding-left:20px; padding-top:70px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Plasmid</td><td><input style="width: 200px" id="plasmid_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Culture Type</td><td> <input style="width: 200px" id="culture_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="bacteria-table" style="float: left"> - <tr class="bacteria-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Bacteria Code</th><th>Plasmid</th><th>Culture Type</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/body-style.css b/plasmid/source-lsi/html/body-style.css deleted file mode 100644 index 9047f06025252e7670a81c2a3747cb776a08c466..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/body-style.css +++ /dev/null @@ -1,232 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#DC7E9E; -} - -.properties td:nth-child(even) { - background-color:#ECEFEF; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} -.oligo-table-data-cell { - overflow: hidden; -} - -#oligo-table tr:nth-child(odd) { - background-color:#94B8B8; -} - -#oligo-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#oligo-table tr.oligo-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - - -#oligo-table td{ - -padding:5px; -} - -#oligo-table tr.oligo-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#426262; -} - - -.chemical-table-data-cell { - overflow: hidden; -} - -#chemical-table tr:nth-child(odd) { - background-color:#B2B2B2; -} - -#chemical-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#chemical-table tr.chemical-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - - -#chemical-table td{ - -padding:5px; -} - -#chemical-table tr.chemical-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#767676; -} - - -.plasmid-table-data-cell { - overflow: hidden; -} - -#plasmid-table tr:nth-child(odd) { - background-color:#DC7E9E; -} - -#plasmid-table tr:nth-child(even) { - background-color:#ECEFEF; -} - -#plasmid-table tr.plasmid-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - -#plasmid-table td{ - -padding:5px; -} - -#plasmid-table tr.plasmid-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#6E3F4F; -} - - - - -.yeast-table-data-cell { - overflow: hidden; -} - -#yeast-table tr:nth-child(odd) { - background-color:#A6A64D; -} - -#yeast-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#yeast-table tr.yeast-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - -#yeast-table td{ - -padding:5px; -} - -#yeast-table tr.yeast-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#5C5C1F; -} - diff --git a/plasmid/source-lsi/html/button.css b/plasmid/source-lsi/html/button.css deleted file mode 100644 index 2a83cfcf2ec1a2149b54abafac67771eefb83266..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/button.css +++ /dev/null @@ -1,329 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #0000FF ; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 40; - border-radius: 5px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: steelblue; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - - -#chembio_browser a:link -{ -display:block; -font-weight:bold; -color:#101010 ; -background-color:#FAFAD2; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - -#chembio_browser a:visited -{ -background-color:#FAFAD2; -color:#101010; -} - -#chembio_browser a:hover -{ -background-color:#C8C8A8; -color:#FFFFFF; -} - - -#chembio_browser a:active -{ -background-color:#C8C8A8; -color:#FFFFFF; -} - - -#oligo_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#C2A366; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - -#oligo_browser a:visited -{ -background-color:#C2A366; -color:#101010; -} - -#oligo_browser a:hover -{ -background-color:#A37519; -color:#FFFFFF; -} - -#enzyme_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#E6CC80; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#enzyme_browser a:visited -{ -background-color:#E6CC80; -color:#101010; -} - - -#enzyme_browser a:hover -{ -background-color:#D1A319; -color:#FFFFFF; -} - - - - -#bacteria_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#DC7E9E; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#bacteria_browser a:visited -{ -background-color:#DC7E9E; -color:#101010; -} - - -#bacteria_browser a:hover -{ -background-color:#6E3F4F; -color:#FFFFFF; -} - -#plasmid_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#C28566; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - - -#plasmid_browser a:visited -{ -background-color:#C28566; -color:#101010; -} - - -#plasmid_browser a:hover -{ -background-color:#A34719; -color:#FFFFFF; -} - - -#prAntibody_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#C4D2A7; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - -#prAntibody_browser a:visited -{ -background-color:#C4D2A7; -color:#101010; -} - - -#prAntibody_browser a:hover -{ -background-color:#97B065; -color:#FFFFFF; -} - -#secAntibody_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#9AC39A; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - -#secAntibody_browser a:visited -{ -background-color:#9AC39A; -color:#101010; -} - - -#secAntibody_browser a:hover -{ -background-color:#729672; -color:#FFFFFF; -} - -#equipment_browser a:link -{ -display:block; -font-weight:bold; -color:#101010; -background-color:#ECDFEC; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} - -#equipment_browser a:visited -{ -background-color:#ECDFEC; -color:#101010; -} - - -#equipment_browser a:hover -{ -background-color:#C2ACC2; -color:#FFFFFF; -} - -#title{ - font: 25px "Trebuchet MS"; - color: #0000cc; - font-weight:bold; - text-align:center; - -} - -#filter-button a:link -{ -display:block; -font-weight:bold; -color:#FFFFFF; -background-color:#0000FF; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#filter-button a:visited -{ -background-color:#0000FF; -color:#FFFFFF; -} - -#filter-button a:hover -{ -background-color:steelblue; -color:#FFFFFF; -} diff --git a/plasmid/source-lsi/html/chembio-body-style.css b/plasmid/source-lsi/html/chembio-body-style.css deleted file mode 100644 index ae7e645c41391399315010996248a10407d0007a..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/chembio-body-style.css +++ /dev/null @@ -1,32 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - - -.chembio-table-data-cell { - overflow: hidden; -} - -#chembio-table tr:nth-child(odd) td{ - background-color:#FAFAD2; -} - - -#chembio-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - - -#chembio-table td{ -padding:5px; -} - -#chembio-table tr.chembio-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#C8C8A8; -} - - diff --git a/plasmid/source-lsi/html/chembio-browser.html b/plasmid/source-lsi/html/chembio-browser.html deleted file mode 100644 index e22a3b71b8841d8c6c13b48af153ea565ce1a3ec..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/chembio-browser.html +++ /dev/null @@ -1,439 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>ChemBio Browser</title> - <link type="text/css" rel="stylesheet" href="chembio-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - - -// Some global variables we refer to - -/// All ChemBio -var ChemBio = null; - -/// The ChemBio that are currently being inspected -var inspectedChemBio = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - ChemBio = objectOrId; - } else { - ChemBio = ChemBioById[objectOrId]; - } - - return ChemBio; -} - - - -/** Initialize the ChemBio variable */ -function initializeChemBio(result) -{ - // Construct a map of all ChemBio by id - ChemBioById = {}; - - // Split the ChemBio into two groups, the ones that start with FRP in their sample name and the other ones. - var frpChemBio = [], otherChemBio = []; - var frpRegex = /^B[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - ChemBioById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the ChemBioById map - theSample = ChemBioById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpChemBio.push(theSample); - } else { - otherChemBio.push(theSample); - } - }); - - // Sort each of the groups - otherChemBio.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpChemBio.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of ChemBio - ChemBio = frpChemBio.concat(otherChemBio); -} - - - -function inspectChemBio(ChemBio) -{ - if (inspectedChemBio.indexOf(ChemBio) < 0) { - inspectedChemBio.push(ChemBio); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var ChemBioToSend = $.extend({}, ChemBio); - delete ChemBioToSend.parents; - delete ChemBioToSend.children; - openbisServer.listDataSetsForSample(ChemBioToSend, true, dataset.curry(ChemBio)); - } - resizeChemBioTable(); - updateInspectors(1000); -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeChemBio(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (ChemBio.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#chembio-table").selectAll("tr.chembio-table-data").data(ChemBio); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "chembio-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.CHEMICALS_BIOLOGICALS, sample.properties.CHEMICAL_REORDERED, sample.properties.LAB_APPLICATIONS, sample.properties.REORDER_AMOUNT, sample.properties.STOCK, sample.properties.STOCK_AMOUNT, sample.properties.STORAGE, sample.properties.VENDOR, sample.properties.PRODUCT_NUMBER]; }) - .enter() - .append("td") - .append("div") - .attr("class", "chembio-table-data-cell") - .text(String) - -} - -function ChemBioFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, chembioFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (chembioFilterText == undefined) - { - chembioFilterText = ""; - } - - - - - var displayedChemBio = ChemBio.filter(ChemBioFilter.curry(codeFilterText, "CODE")); - displayedChemBio = displayedChemBio.filter(ChemBioFilter.curry(chembioFilterText, "CHEMICALS_BIOLOGICALS")); - - - - - - var selection2 = d3.select("#vis").select("#chembio-table").selectAll("tr.chembio-table-data").data(ChemBio); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedChemBio) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "CHEMICALS_AND_BIOLOGICALS" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#chembio_filter').val(), $('#ordered_filter').val()); - }); - - $('#chembio_filter').keyup(function() { - visualize($('#code_filter').val(), $('#chembio_filter').val(), $('#ordered_filter').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Chemicals and Biologicals </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - - - <div id="filter-button" style="padding-left:200px; padding-top:600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Chemicals & Biologicals</td><td><input style="width: 200px" id="chembio_filter" type="text"></td></tr> - </table> - </div> - - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="chembio-table" style="float: left"> - <tr class="chembio-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th> Code</th><th>Chemicals & Biologicals</th><th>Ordered?</th><th>Lab Applications</th><th>Ordered Amount</th><th>In Stock?</th><th>Amount in stock</th><th>Storage</th><th>Vendor</th><th>Product Number</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> -<!-- </div> - <span id="inspectorsContainer"></span> - </div> --> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/d3.js b/plasmid/source-lsi/html/d3.js deleted file mode 100755 index 13abb6dbc6f9665c005209b8e09d0dc97266d1f7..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/plasmid/source-lsi/html/d3.layout.js b/plasmid/source-lsi/html/d3.layout.js deleted file mode 100755 index 6cc1d7161677597ae7f718a4c0cafb90a240a56a..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/plasmid/source-lsi/html/d3.time.js b/plasmid/source-lsi/html/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/plasmid/source-lsi/html/d3.tsv.js b/plasmid/source-lsi/html/d3.tsv.js deleted file mode 100644 index 8d9a5e4f7038bfe558e2cca878854d234b770b8d..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/d3.tsv.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * TSV Parser from: - * https://github.com/vlandham/d3.tsv - */ -(function(){d3.tsv = function(url, callback) { - d3.text(url, "text/tab-separated-values", function(text) { - callback(text && d3.tsv.parse(text, "\t")); - }); -}; - -d3.tsv.version = "0.0.2" -d3.tsv.parse = function(text, separator) { - var header; - return separator && d3.tsv.parseRows(text, separator, function(row, i) { - if (i) { - var o = {}, j = -1, m = header.length; - while (++j < m) o[header[j]] = row[j]; - return o; - } else { - header = row; - return null; - } - }); -}; - -d3.tsv.parseRows = function(text, separator, f) { - var EOL = {}, // sentinel value for end-of-line - EOF = {}, // sentinel value for end-of-file - rows = [], // output rows - re = new RegExp("\r\n|[" + separator + "\r\n]", "g"), // field separator regex - separatorCode = separator.charCodeAt(0), // code to match separator with - n = 0, // the current line number - t, // the current token - eol; // is the current token followed by EOL? - - re.lastIndex = 0; // work-around bug in FF 3.6 - - /** @private Returns the next token. */ - function token() { - if (re.lastIndex >= text.length) return EOF; // special case: end of file - if (eol) { eol = false; return EOL; } // special case: end of line - - // special case: quotes - var j = re.lastIndex; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < text.length) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - i++; - } - } - re.lastIndex = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) re.lastIndex++; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, "\""); - } - - // common case - var m = re.exec(text); - if (m) { - eol = m[0].charCodeAt(0) !== separatorCode; - return text.substring(j, m.index); - } - re.lastIndex = text.length; - return text.substring(j); - } - - while ((t = token()) !== EOF) { - var a = []; - while ((t !== EOL) && (t !== EOF)) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - - return rows; -}; -d3.tsv.format = function(rows) { - return rows.map(function (row) { - return d3_formatRow(row, "\t"); - }).join("\n"); -}; - -function d3_formatRow(row, separator) { - return row.map(d3_formatValue).join(separator); -} - -function d3_formatValue(text) { - return /[",\n]/.test(text) - ? "\"" + text.replace(/\"/g, "\"\"") + "\"" - : text; -} -})(); \ No newline at end of file diff --git a/plasmid/source-lsi/html/enzyme-body-style.css b/plasmid/source-lsi/html/enzyme-body-style.css deleted file mode 100644 index d4df0a129a0fabd47e8647a0da3d569fbff4c40d..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/enzyme-body-style.css +++ /dev/null @@ -1,58 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis_enzyme { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis_enzyme div { padding-top: 2px;} - - - -enzyme.table { counter-reset: line-number; } - -.enzyme-table-data-cell { - overflow: hidden; - -} - -#enzyme-table tr:nth-of-type(odd) { - background-color:#E6CC80; -} - -#enzyme-table tr:nth-of-type(even) { - background-color:#ECEFEF; -} - - - - -#enzyme-table tr.enzyme-table-data td { - padding: 5px; -} - -#enzyme-table tr.enzyme-table-data:hover td { - padding: 5px 2px; -} - -#enzyme-table td{ - -padding:5px; -} - -#enzyme-table tr.enzyme-table-header { - - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#D1A319; -} - -#enzyme-table th { - - padding-left:5px; - padding-right:5px; -} - diff --git a/plasmid/source-lsi/html/enzyme-browser.html b/plasmid/source-lsi/html/enzyme-browser.html deleted file mode 100644 index f3a9e969e9e03a42947cb8ea32804ec73142e47c..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/enzyme-browser.html +++ /dev/null @@ -1,497 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Enzyme Browser</title> - <link type="text/css" rel="stylesheet" href="enzyme-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - -// Some global variables we refer to - -/// All enzyme -var enzyme = null; - -/// The enzyme that are currently being inspected -var inspectedEnzyme = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis_enzyme"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["ENZYME", "INACTIVIATION_TEMP", "INCUBATION_TEMP","REACTION_CONDITIONS","RESTRICTION_SITE"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - enzyme = objectOrId; - } else { - enzyme = enzymeById[objectOrId]; - } - - return enzyme; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the enzyme variable */ -function initializeEnzyme(result) -{ - // Construct a map of all enzyme by id - enzymeById = {}; - - // Split the enzyme into two groups, the ones that start with FRP in their sample name and the other ones. - var frpEnzyme = [], otherEnzyme = []; - var frpRegex = /^B[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - enzymeById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the enzymeById map - theSample = enzymeById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpEnzyme.push(theSample); - } else { - otherEnzyme.push(theSample); - } - }); - - // Sort each of the groups - otherEnzyme.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpEnzyme.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of enzyme - enzyme = frpEnzyme.concat(otherEnzyme); -} - - -// - - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeEnzyme(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (enzyme.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis_enzyme").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzyme); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "enzyme-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.ENZYME, sample.properties.INACTIVIATION_TEMP, sample.properties.INCUBATION_TEMP, sample.properties.REACTION_CONDITIONS, sample.properties.RESTRICTION_SITE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "enzyme-table-data-cell") - .text(String) - -} - -function enzymeFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, enzFilterText) -{ - - - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - if (enzFilterText == undefined) - { - enzFilterText = ""; - } - - - - - var displayedEnzyme = enzyme.filter(enzymeFilter.curry(codeFilterText, "CODE")); - displayedEnzyme = displayedEnzyme.filter(enzymeFilter.curry(enzFilterText, "ENZYME")); - - - - - var selection2 = d3.select("#vis_enzyme").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzyme); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedEnzyme) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "ENZYMES" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#enz_filter').val()); - }); - - $('#enz_filter').keyup(function() { - visualize($('#code_filter').val(), $('#enz_filter').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Enzymes </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - - - - <div id="filter-button" style="padding-left:200px; padding-top:600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Enzymes</td><td><input style="width: 200px" id="enz_filter" type="text"></td></tr> - </table> - </div> - - - - - <div id="vis_enzyme"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="enzyme-table" style="float: left"> - <tr class="enzyme-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Enzyme Code</th><th>Enzyme</th><th>Inactivation Temp.</th><th>Incubation Temp.</th><th>Reaction Conditions</th><th>Restriction Sites</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/equipment-body-style.css b/plasmid/source-lsi/html/equipment-body-style.css deleted file mode 100644 index 862c83d4ef2cc80e4e00782e238495312e00af1c..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/equipment-body-style.css +++ /dev/null @@ -1,48 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - - -/* Table */ - - -.equipment-table-data-cell { - overflow: hidden; - -} - - -#equipment-table tr:nth-child(odd) td{ - background-color:#ECDFEC; -} - - -#equipment-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - - - -#equipment-table td{ - -padding:5px; -} - -#equipment-table tr.equipment-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#C2ACC2; - -} - - - - diff --git a/plasmid/source-lsi/html/equipment-browser.html b/plasmid/source-lsi/html/equipment-browser.html deleted file mode 100644 index 078728cb362d4f2d31c354e5e79cc4adc617df76..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/equipment-browser.html +++ /dev/null @@ -1,709 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Plasmid Browser</title> - <link type="text/css" rel="stylesheet" href="equipment-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - -//openbisServer = new openbis('https://localhost:8443/openbis/openbis', 'https://bs-mbp156.ethz.ch:8443/datastore_server'); - - -// Some global variables we refer to - -/// All equipments -var equipments = null; - -/// The equipments that are currently being inspected -var inspectedPlasmids = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = ["BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - return new_list2; -} - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - equipment = objectOrId; - } else { - equipment = equipmentsById[objectOrId]; - } - - return equipment; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the equipments variable */ -function initializePlasmids(result) -{ - // Construct a map of all equipments by id - equipmentsById = {}; - - // Split the equipments into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - equipmentsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the equipmentsById map - theSample = equipmentsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of equipments - equipments = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the equipment-table based on whether or not inspectors are visible */ -function resizePlasmidTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedPlasmids.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var equipmentTableTransition = d3.selectAll('div.equipment-table-data-cell'); - equipmentTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectPlasmid(equipment) -{ - if (inspectedPlasmids.indexOf(equipment) < 0) { - inspectedPlasmids.push(equipment); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var equipmentToSend = $.extend({}, equipment); - delete equipmentToSend.parents; - delete equipmentToSend.children; - openbisServer.listDataSetsForSample(equipmentToSend, true, dataset.curry(equipment)); - } - resizePlasmidTable(); - updateInspectors(1000); -} - -function closeInspector(equipment) -{ - var index = inspectedPlasmids.indexOf(equipment); - if (index < 0) { - return; - } - - inspectedPlasmids.splice(index, 1); - resizePlasmidTable(); - updateInspectors(1000); -} - -function dataset(equipment, data) { - for (var i in data.result) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(equipment, data.result[i])); - } -} - -function filelist(equipment, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+equipment.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - var downloadUrl = 'https://openbis-lsi.ethz.ch:8444/datastore_server/'+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.sessionToken; - - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedPlasmids, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializePlasmids(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (equipments.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#equipment-table").selectAll("tr.equipment-table-data").data(equipments); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "equipment-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.COMPUTER, sample.properties.CONTACT_PERSON, sample.properties.IDENTIFIER , sample.properties.LOCATION , sample.properties.NAME , sample.properties.PHONE , sample.properties.TYPE, sample.properties.VENDOR, sample.properties.PRODUCTNUMBER, sample.properties.PRICE, sample.properties.CURRENCY]; }) - .enter() - .append("td") - .append("div") - .attr("class", "equipment-table-data-cell") - .text(String) - -} - -function equipmentFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - - - var displayedPlasmids = equipments.filter(equipmentFilter.curry(codeFilterText, "CODE")); - - - - var selection2 = d3.select("#vis").select("#equipment-table").selectAll("tr.equipment-table-data").data(equipments); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedPlasmids) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "EQUIPMENT" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val()); - }); - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Equipment </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - - - - - <div id="filter-button" style="padding-left:200px; padding-top: 600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - </table> - </div> - - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="equipment-table" style="float: left"> - <tr class="equipment-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Code</th><th>Computer</th><th>Contact Person</th><th>Identifier</th><th>Location</th><th>Name</th><th>Phone</th><th>Type</th><th>Vendor</th><th>Product #</th><th>Price</th><th>Currency</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/images/openBIS_Logo.png b/plasmid/source-lsi/html/images/openBIS_Logo.png deleted file mode 100644 index 87ae5e81899908f3968ea230205322dc19ff4ee5..0000000000000000000000000000000000000000 Binary files a/plasmid/source-lsi/html/images/openBIS_Logo.png and /dev/null differ diff --git a/plasmid/source-lsi/html/images/openBIS_Logo.svg b/plasmid/source-lsi/html/images/openBIS_Logo.svg deleted file mode 100644 index 70ac6c77f2774a5a5e8f6875e3c8ae1acb8e952a..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/plasmid/source-lsi/html/infra.js b/plasmid/source-lsi/html/infra.js deleted file mode 100644 index 179cd3b409375d50144557e93f7763eebe393b32..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/infra.js +++ /dev/null @@ -1,45 +0,0 @@ -if (!Array.prototype.filter) -{ - Array.prototype.filter = function(fun /*, thisp*/) - { - var len = this.length; - if (typeof fun != "function") - throw new TypeError(); - - var res = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) - { - if (i in this) - { - var val = this[i]; // in case fun mutates this - if (fun.call(thisp, val, i, this)) - res.push(val); - } - } - - return res; - }; -} - -if (!Function.prototype.curry) -{ - (function () - { - var slice = Array.prototype.slice; - Function.prototype.curry = function () - { - var target = this; - var args = slice.call(arguments); - return function () - { - var allArgs = args; - if (arguments.length > 0) - { - allArgs = args.concat(slice.call(arguments)); - } - return target.apply(this, allArgs); - }; - }; - }()) -}; \ No newline at end of file diff --git a/plasmid/source-lsi/html/oligo-body-style.css b/plasmid/source-lsi/html/oligo-body-style.css deleted file mode 100644 index 43f9f27858a8c90e033ad275b056bebf9683e57e..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/oligo-body-style.css +++ /dev/null @@ -1,125 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width:100%; - -} - - -.properties td:nth-child(odd) { - background-color:#94B8B8; - width: 30%; -} - -.properties td:nth-child(even) { - background-color:#ECEFEF; - width: 70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.oligo-table-data-cell { - overflow: hidden; -} - - -#oligo-table tr:nth-child(odd) { - background-color:#C2A366; -} - -#oligo-table tr:nth-child(even) { - background-color:#ECEFEF; -} - - - - - -#oligo-table td{ - -padding:5px; -} - -#oligo-table tr.oligo-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#A37519; -} - - diff --git a/plasmid/source-lsi/html/oligo-browser.html b/plasmid/source-lsi/html/oligo-browser.html deleted file mode 100644 index 4f5ccb0697ee5b152b25959adb2fd28e540e39c2..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/oligo-browser.html +++ /dev/null @@ -1,579 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Oligo Browser</title> - <link type="text/css" rel="stylesheet" href="oligo-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - -// Some global variables we refer to - -/// All oligos -var oligos = null; - -/// The oligos that are currently being inspected -var inspectedOligos = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order1 = ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "MODIFICATIONS", "SEQUENCE", "PROJECT"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = [ "BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - - return new_list2; -} - - - -/** Initialize the oligos variable */ -function initializeOligos(result) -{ - // Split the oligos into two groups, the ones that start with FRO in their sample name and the other ones. - var froOligos = [], otherOligos = []; - var froRegex = /^FRO[0-9]+/; - froRegex.compile(froRegex); - result.forEach(function(sample) { - if (froRegex.test(sample.code)) { - froOligos.push(sample); - } else { - otherOligos.push(sample); - } - }); - - // Sort each of the groups - otherOligos.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - froOligos.sort(function(a, b) { - // Sort based on the FRO number - var froNumberA = parseInt(a.code.substring(3)); - var froNumberB = parseInt(b.code.substring(3)); - return (froNumberA < froNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of oligos - oligos = froOligos.concat(otherOligos); -} - -/** Set the size of the oligo-table based on whether or not inspectors are visible */ -function resizeOligoTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - if (inspectedOligos.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) /6 ) - padding + "px"; - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var oligoTableTransition = d3.selectAll('div.oligo-table-data-cell'); - oligoTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectOligo(oligo) -{ - if (inspectedOligos.indexOf(oligo) < 0) { - inspectedOligos.push(oligo); - openbisServer.listDataSetsForSample(oligo, true, dataset.curry(oligo)); - } - resizeOligoTable(); - updateInspectors(1000); -} - -function closeInspector(oligo) -{ - var index = inspectedOligos.indexOf(oligo); - if (index < 0) { - return; - } - - inspectedOligos.splice(index, 1); - resizeOligoTable(); - updateInspectors(1000); -} - -function dataset(oligo, data) { - for (var i in data.result) { - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(oligo, data.result[i])); - } -} - -function filelist(oligo, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+oligo.code+"_INSPECTOR"); - var fileTable = inspector.select("table"); - var pathInDataSet = files.result[i].pathInDataSet; - var downloadUrl = 'https://openbis-lsi.ethz.ch:8444/datastore_server/'+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.sessionToken; - fileTable.append("tr").append("td").attr("colspan", "2").append("a").attr("href", downloadUrl).text(pathInDataSet); - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedOligos, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeOligos(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (oligos.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "oligo-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.BASES, sample.properties.PRINT_DATE,sample.properties.SEQUENCE, sample.properties.SEQUENCE_NAME, sample.properties.TM]; }) - .enter() - .append("td") - .append("div") - .attr("class", "oligo-table-data-cell") - .text(String) - -} - -function oligoFilter(filter, property, element, index, array) { - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, sequenceNameFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (sequenceNameFilterText == undefined) - { - sequenceNameFilterText = ""; - } - - - - var displayedOligos = oligos.filter(oligoFilter.curry(codeFilterText, "CODE")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(sequenceNameFilterText, "SEQUENCE_NAME")); - - - var selection2 = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedOligos) != -1) { - return "table-row" - } else { - return "none" - } - }); - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "OLIGOS" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamples(sampleCriteria, displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#sequenceName_filter').val()); - }); - - $('#sequenceName_filter').keyup(function() { - visualize($('#code_filter').val(), $('#sequenceName_filter').val()); - }); - - - - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Oligos </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px; top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - -<div id="filter-button" style="padding-left:200px; padding-top: 600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="oligo-table" style="float: left"> - <tr class="oligo-table-header"><th>Oligo Code</th><th>Bases</th><th>Print Date</th><th>Sequence</th><th>Sequence Name</th><th>Melting Temp C</th></tr> - </table> - </div> - - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/plasmid-body-style.css b/plasmid/source-lsi/html/plasmid-body-style.css deleted file mode 100644 index 8ed9edc5aa6004abc9ab2f3a18fdb6a07e8e3450..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/plasmid-body-style.css +++ /dev/null @@ -1,129 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#DC7E9E; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#ECEFEF; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.plasmid-table-data-cell { - overflow: hidden; - -} - - -#plasmid-table tr:nth-child(odd) td{ - background-color:#C28566; -} - - -#plasmid-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - -#plasmid-table tr.plasmid-table-data:hover { - font-weight: bold; - -} - -#plasmid-table td{ - -padding:5px; -} - -#plasmid-table tr.plasmid-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#A34719; - -} - - - - diff --git a/plasmid/source-lsi/html/plasmid-browser.html b/plasmid/source-lsi/html/plasmid-browser.html deleted file mode 100644 index 177682cfa7f226bb2aa41be5c7fee245d0d44028..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/plasmid-browser.html +++ /dev/null @@ -1,736 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Plasmid Browser</title> - <link type="text/css" rel="stylesheet" href="plasmid-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - -<meta http-equiv="content-script-type" content="text/javascript"> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - - -// Some global variables we refer to - -/// All plasmids -var plasmids = null; - -/// The plasmids that are currently being inspected -var inspectedPlasmids = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["OWNER" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - //pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = ["BOX_NUMBER", "ROW", "COLUMN"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - return new_list2; -} - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - plasmid = objectOrId; - } else { - plasmid = plasmidsById[objectOrId]; - } - - return plasmid; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the plasmids variable */ -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the plasmid-table based on whether or not inspectors are visible */ -function resizePlasmidTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedPlasmids.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var plasmidTableTransition = d3.selectAll('div.plasmid-table-data-cell'); - plasmidTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectPlasmid(plasmid) -{ - if (inspectedPlasmids.indexOf(plasmid) < 0) { - inspectedPlasmids.push(plasmid); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var plasmidToSend = $.extend({}, plasmid); - delete plasmidToSend.parents; - delete plasmidToSend.children; - openbisServer.listDataSetsForSample(plasmidToSend, true, dataset.curry(plasmid)); - } - resizePlasmidTable(); - updateInspectors(1000); -} - -function closeInspector(plasmid) -{ - var index = inspectedPlasmids.indexOf(plasmid); - if (index < 0) { - return; - } - - inspectedPlasmids.splice(index, 1); - resizePlasmidTable(); - updateInspectors(1000); -} - -function dataset(plasmid, data) { - for (var i in data.result) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(plasmid, data.result[i])); - } -} - -function filelist(plasmid, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+plasmid.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - var downloadUrl = 'https://openbis-lsi.ethz.ch:8444/datastore_server/'+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.sessionToken; - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - - if (/\.jpg$/.test(pathInDataSet)) { - var jpgFile = downloadUrl; - inspector.append("img") - .attr("src", jpgFile) - .attr("width", inspectorsWidth - 20) - .attr("height", "auto"); - } - - - - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedPlasmids, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializePlasmids(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (plasmids.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "plasmid-table-data") - .style("cursor", "pointer") - .on("click", inspectPlasmid) - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.PLASMID, sample.properties.ANTIBIOTIC, sample.properties.FORMAT]; }) - .enter() - .append("td") - .append("div") - .attr("class", "plasmid-table-data-cell") - .text(String) - -} - -function plasmidFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, plasmidFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (plasmidFilterText == undefined) - { - plasmidFilterText = ""; - } - - - - var displayedPlasmids = plasmids.filter(plasmidFilter.curry(codeFilterText, "CODE")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(plasmidFilterText, "PLASMID")); - - - - - var selection2 = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedPlasmids) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PLASMIDS" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#plasmid_filter').val()); - }); - - $('#plasmid_filter').keyup(function() { - visualize($('#code_filter').val(), $('#plasmid_filter').val()); - }); - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - - - <div id="main"> - <div id = "title" style="padding-top:20px"> Plasmids </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - -<!-- - <div id="filter-button" style="padding-left:200px; padding-top: 600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Plasmid Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Plasmid</td><td><input style="width: 200px" id="plasmid_filter" type="text"></td></tr> - </table> - </div> ---> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="plasmid-table" style="float: left"> - <tr class="plasmid-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Plasmid Code</th><th>Plasmid</th><th>Antibiotic Resistance</th><th>Format</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/prAntibody-body-style.css b/plasmid/source-lsi/html/prAntibody-body-style.css deleted file mode 100644 index 834787455e8f359a0d4f1b60db52b4d8d5816fcd..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/prAntibody-body-style.css +++ /dev/null @@ -1,49 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - - - -/* Table */ - - -.prAntibody-table-data-cell { - overflow: hidden; - -} - - -#prAntibody-table tr:nth-child(odd) td{ - background-color:#C4D2A7; -} - - -#prAntibody-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - - - -#prAntibody-table td{ - -padding:5px; -} - -#prAntibody-table tr.prAntibody-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#97B065; - -} - - - - diff --git a/plasmid/source-lsi/html/prAntibody-browser.html b/plasmid/source-lsi/html/prAntibody-browser.html deleted file mode 100644 index 1a256e3b86de4f126e957dfd4ee4dc12fe170f55..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/prAntibody-browser.html +++ /dev/null @@ -1,519 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Plasmid Browser</title> - <link type="text/css" rel="stylesheet" href="prAntibody-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - -//openbisServer = new openbis('https://localhost:8443/openbis/openbis', 'https://bs-mbp156.ethz.ch:8443/datastore_server'); - - -// Some global variables we refer to - -/// All prAntibodys -var prAntibodys = null; - -/// The prAntibodys that are currently being inspected -var inspectedprAntibodies = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = ["BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - return new_list2; -} - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - prAntibody = objectOrId; - } else { - prAntibody = prAntibodysById[objectOrId]; - } - - return prAntibody; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the prAntibodys variable */ -function initializeprAntibodies(result) -{ - // Construct a map of all prAntibodys by id - prAntibodysById = {}; - - // Split the prAntibodys into two groups, the ones that start with FRP in their sample name and the other ones. - var frpprAntibodies = [], otherprAntibodies = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - prAntibodysById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the prAntibodysById map - theSample = prAntibodysById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpprAntibodies.push(theSample); - } else { - otherprAntibodies.push(theSample); - } - }); - - // Sort each of the groups - otherprAntibodies.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpprAntibodies.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of prAntibodys - prAntibodys = frpprAntibodies.concat(otherprAntibodies); -} - - - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeprAntibodies(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (prAntibodys.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#prAntibody-table").selectAll("tr.prAntibody-table-data").data(prAntibodys); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "prAntibody-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.ANTIGEN, sample.properties.REACTIVITY, sample.properties.APPLICATION, sample.properties.DILUTION, sample.properties.HOST, sample.properties.ISOTYPE, sample.properties.LABEL, sample.properties.STOCK_CONCENTRATION, sample.properties.VENDOR, sample.properties.PRODUCT_NUMBER, sample.properties.PRICE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "prAntibody-table-data-cell") - .text(String) - -} - -function prAntibodyFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, antigenNumFilterText ) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (antigenNumFilterText == undefined) - { - antigenFilterText = ""; - } - - - var displayedprAntibodies = prAntibodys.filter(prAntibodyFilter.curry(codeFilterText, "CODE")); - displayedprAntibodies = displayedprAntibodies.filter(prAntibodyFilter.curry(antigenNumFilterText, "ANTIGEN")); - - - - - var selection2 = d3.select("#vis").select("#prAntibody-table").selectAll("tr.prAntibody-table-data").data(prAntibodys); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedprAntibodies) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PRIMARY_ANTIBODIES" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#antigen_filter').val()); - }); - - $('#antigen_filter').keyup(function() { - visualize($('#code_filter').val(), $('#antigen_filter').val()); - }); - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Primary Antibodies </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - - - <div id="filter-button" style="padding-left:200px; padding-top: 600px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Code</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Antigen</td><td><input style="width: 200px" id="antigen_filter" type="text"></td></tr> - </table> - </div> - - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="prAntibody-table" style="float: left"> - <tr class="prAntibody-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Code</th><th>Antigen</th><th>Reactivity</th><th>Application</th><th>Dilution</th><th>Host</th><th>Isotype</th><th>Label</th><th>Stock Concentration</th><th>Vendor</th><th>Product Number</th><th>Price</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/secAntibody-body-style.css b/plasmid/source-lsi/html/secAntibody-body-style.css deleted file mode 100644 index 8e21cf6809e87ca632aeb491b8424d475d457ac5..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/secAntibody-body-style.css +++ /dev/null @@ -1,48 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - - -/* Table */ - - -.secAntibody-table-data-cell { - overflow: hidden; - -} - - -#secAntibody-table tr:nth-child(odd) td{ - background-color:#9AC39A; -} - - -#secAntibody-table tr:nth-child(even) td{ - background-color:#ECEFEF; -} - - - -#secAntibody-table td{ - -padding:5px; -} - -#secAntibody-table tr.secAntibody-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#729672; - -} - - - - diff --git a/plasmid/source-lsi/html/secAntibody-browser.html b/plasmid/source-lsi/html/secAntibody-browser.html deleted file mode 100644 index 3b95113dc53cac7fee4c3f6b9e3f438691ac6bb0..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/secAntibody-browser.html +++ /dev/null @@ -1,755 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Plasmid Browser</title> - <link type="text/css" rel="stylesheet" href="secAntibody-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis('https://openbis-lsi.ethz.ch:8443/openbis/openbis', 'https://openbis-lsi.ethz.ch:8444/datastore_server'); - -//openbisServer = new openbis('https://localhost:8443/openbis/openbis', 'https://bs-mbp156.ethz.ch:8443/datastore_server'); - - -// Some global variables we refer to - -/// All secAntibodys -var secAntibodys = null; - -/// The secAntibodys that are currently being inspected -var inspectedPlasmids = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = ["BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - return new_list2; -} - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - secAntibody = objectOrId; - } else { - secAntibody = secAntibodysById[objectOrId]; - } - - return secAntibody; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the secAntibodys variable */ -function initializePlasmids(result) -{ - // Construct a map of all secAntibodys by id - secAntibodysById = {}; - - // Split the secAntibodys into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - secAntibodysById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the secAntibodysById map - theSample = secAntibodysById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of secAntibodys - secAntibodys = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the secAntibody-table based on whether or not inspectors are visible */ -function resizePlasmidTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedPlasmids.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var secAntibodyTableTransition = d3.selectAll('div.secAntibody-table-data-cell'); - secAntibodyTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectPlasmid(secAntibody) -{ - if (inspectedPlasmids.indexOf(secAntibody) < 0) { - inspectedPlasmids.push(secAntibody); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var secAntibodyToSend = $.extend({}, secAntibody); - delete secAntibodyToSend.parents; - delete secAntibodyToSend.children; - openbisServer.listDataSetsForSample(secAntibodyToSend, true, dataset.curry(secAntibody)); - } - resizePlasmidTable(); - updateInspectors(1000); -} - -function closeInspector(secAntibody) -{ - var index = inspectedPlasmids.indexOf(secAntibody); - if (index < 0) { - return; - } - - inspectedPlasmids.splice(index, 1); - resizePlasmidTable(); - updateInspectors(1000); -} - -function dataset(secAntibody, data) { - for (var i in data.result) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(secAntibody, data.result[i])); - } -} - -function filelist(secAntibody, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+secAntibody.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - var downloadUrl = 'https://openbis-lsi.ethz.ch:8444/datastore_server/'+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.sessionToken; - - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedPlasmids, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier; - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializePlasmids(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (secAntibodys.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#secAntibody-table").selectAll("tr.secAntibody-table-data").data(secAntibodys); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "secAntibody-table-data") - .selectAll("td").data(function(sample) { return [sample.identifier, sample.properties.APPLICATION, sample.properties.DILUTION, sample.properties.HOST , sample.properties.ISOTYPE , sample.properties.LABEL , sample.properties.STOCK_CONCENTRATION , sample.properties.VENDOR, sample.properties.PRODUCT_NUMBER , sample.properties.PRICE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "secAntibody-table-data-cell") - .text(String) - -} - -function secAntibodyFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, secAntibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (secAntibodyNameFilterText == undefined) - { - secAntibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedPlasmids = secAntibodys.filter(secAntibodyFilter.curry(ownerFilterText, "OWNER")); - displayedPlasmids = displayedPlasmids.filter(secAntibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedPlasmids = displayedPlasmids.filter(secAntibodyFilter.curry(secAntibodyNameFilterText, "PLASMID_NAME")); - displayedPlasmids = displayedPlasmids.filter(secAntibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedPlasmids = displayedPlasmids.filter(secAntibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedPlasmids = displayedPlasmids.filter(secAntibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#secAntibody-table").selectAll("tr.secAntibody-table-data").data(secAntibodys); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedPlasmids) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "SECONDARY_ANTIBODIES" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis() - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#secAntibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#secAntibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS LSI</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> Secondary Antibodies </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;top:10px;">Logout</button> - </div> - <div id="chembio_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/chembio-browser.html">ChemBio</a> - </div> - <div id="prAntibody_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/prAntibody-browser.html">Primary Antibodies</a> - </div> - <div id="secAntibody_browser" style="position: absolute; left:10px; top:210px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/secAntibody-browser.html">Secondary Antibodies</a> - </div> - <div id="enzyme_browser" style="position: absolute; left:10px; top:270px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/enzyme-browser.html">Enzymes</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:320px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:370px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/plasmid-browser.html">Plasmids</a> - </div> - <div id="bacteria_browser" style="position: absolute; left:10px; top:420px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/bacteria-browser.html">Bacteria</a> - </div> - <div id="equipment_browser" style="position: absolute; left:10px; top:470px"> - <a href="file:///Users/barillac/workspace/plasmid/source-lsi/html/equipment-browser.html">Equipment</a> - </div> - - - -<!-- - <div id="filter-button" style="padding-left:500px; padding-top: 650px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 100px">Owner</td><td><input style="width: 200px" id="code_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="secAntibody-table" style="float: left"> - <tr class="secAntibody-table-header" style="position: relative; top: expression(this.offsetParent.scrollTop-2);"><th>Code</th><th>Application</th><th>Dilution</th><th>Host</th><th>Isotype</th><th>Label</th><th>Stock Concentration</th><th>Vendor</th><th>Product Number</th><th>Price</th></tr> - <tbody><tr style="overflow:scroll"></tr></tbody> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source-lsi/html/webapp.js b/plasmid/source-lsi/html/webapp.js deleted file mode 100644 index 1fe2e0bad4ea699d52ebeec6aac084b6538eeecf..0000000000000000000000000000000000000000 --- a/plasmid/source-lsi/html/webapp.js +++ /dev/null @@ -1,59 +0,0 @@ - -function showSamplesRecursively(top, samples, depth) -{ - if (depth > 2) return; - - var sampEnter = - top.selectAll("div.samp") - .data(samples) - .enter() - .append("div") - .attr("class", "samp") - .style("left", depth > 0 ? "40px" : 0) - .text(function(d) { return d.identifier}); - - showSamplesRecursively(sampEnter, function(d) {return d.parents ? d.parents : [] }, depth + 1); -} - -function showSamplesWithParents(samples) { - var top = d3.select("#main"); - samples = samples.filter(function(d) {return d.parents != null}); - showSamplesRecursively(top, samples, 0); -} - -function retrieveAndShowSamplesWithParents() { - - var samplesWithParentsSc = - { - operator : "MATCH_ALL_CLAUSES", - subCriterias: [ - { - targetEntityKind: "SAMPLE_PARENT", - criteria: { - matchClauses : [ - {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : "FR*" - }]} - } - ] - }; - - openbisServer.searchForSamplesWithFetchOptions( - samplesWithParentsSc, - ["PROPERTIES", "ANCESTORS"], - function(data) { showSamplesWithParents(data.result) }); - -} - - -function enterApp() -{ - $("#login-form-div").hide(); - $("#main").show(); - $('#openbis-logo').height(50); - - retrieveAndShowSamplesWithParents(); -} - diff --git a/plasmid/source/core-plugins/christenmigration/1/as/definitions.py b/plasmid/source/core-plugins/christenmigration/1/as/definitions.py deleted file mode 100644 index d968b20a1f86762deb0dbb134984f298de1388b6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/as/definitions.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Documentation -## -## Properties starting by "+" will be created in openBIS, but will not be read from FileMaker but if set programmatically will be put back in openBIS. -## Properties starting by "-" will not be created in openBIS but will be read from FileMaker. - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -annotationsScriptName="ANNOTATIONS" -boxLocationScriptName="BOX_LOCATION"; -maxPlasmidMapIDScriptName="MAX_PLASMID_MAP_ID" -maxPlasmidIDScriptName="MAX_PLASMID_ID" -slotScriptName="SLOT" -PlasmidMapIDScriptName="PLASMID_MAP_ID" - - -seqFileDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", "COMMENTS_DATA_SET", None,False] -]; - - -# -#Sample Types -# - - -strainDefinition = [ - ["NAME", "General", "plasmid name", DataType.VARCHAR, None, "", None, None, False], - ["BOX_LOCATION", "General", "box location", DataType.INTEGER, None, "", boxLocationScriptName, None, False], - ["CONSTRUCTION_METHOD", "General", "constructionMethod", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "CreationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "ModificationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["PLASMID_ID", "General", "plasmid_ID", DataType.INTEGER, None, "", None, None, False], - ["BC_STRAIN_RESISTANCE", "General", "resistance", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_RESISTANCE", "", None, None, False], - ["SEQUENCE", "General", "sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SLOT", "General", "slot", DataType.INTEGER, None, "", slotScriptName, None, False], - ["STRAIN_VECTOR", "General", "vector", DataType.VARCHAR, None, "", None, None, False], - ["KEYWORDS", "General", "keywords", DataType.CONTROLLEDVOCABULARY, "KEYWORDS", "", None, None, False], - ["BC_STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_SOURCE", "", None, None, False], - ["BC_STRAIN_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_ORGANISM", "", None, None, False], - ["PUBLICATION", "References", "reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -oligoDefinition = [ - ["NAME", "General", "Primer_name", DataType.VARCHAR, None, "", None, None, False], - ["SEQUENCE", "General", "Primer_Sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["OLIGO_TARGET", "General", "Target", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["-PRIMER_NUMBER", "General", "Primer_number", DataType.INTEGER, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -DNADefinition = [ - ["NAME", "General", "plasmid name", DataType.VARCHAR, None, "", None, None, False], - ["BOX_LOCATION", "General", "box location", DataType.INTEGER, None, "", boxLocationScriptName, None, False], - ["CONSTRUCTION_METHOD", "General", "constructionMethod", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "CreationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "ModificationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["PLASMID_ID", "General", "plasmid_ID", DataType.INTEGER, None, "", None, None, False], - ["DNA_SIZE", "General", "size", DataType.REAL, None, "", None, None, False], - ["RESTRICTION_ENZYME", "General", "Restriction enzymes", DataType.VARCHAR, None, "", None, None, False], - ["DNA_PURITY", "General", "purity", DataType.CONTROLLEDVOCABULARY, "DNA_PURITY", "", None, None, False], - ["PCR_POLYMERASE", "General", "PCR polymerase", DataType.CONTROLLEDVOCABULARY, "PCR_POLYMERASE", "", None, None, False], - ["DNA_TYP", "General", "DNA typ", DataType.CONTROLLEDVOCABULARY, "DNA_TYP", "", None, None, False], - ["DNA_MODIFICATIONS", "General", "DNA modifications", DataType.CONTROLLEDVOCABULARY, "DNA_MODIFICATIONS", "", None, None, False], - ["DNA_RESISTANCE", "General", "resistance", DataType.CONTROLLEDVOCABULARY, "DNA_RESISTANCE", "", None, None, False], - ["SEQUENCE", "General", "Sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SLOT", "General", "slot", DataType.INTEGER, None, "", slotScriptName, None, False], - ["DNA_VECTOR", "General", "vector", DataType.VARCHAR, None, "", None, None, False], - ["PUBLICATION", "References", "reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - - diff --git a/plasmid/source/core-plugins/christenmigration/1/as/definitionsVoc.py b/plasmid/source/core-plugins/christenmigration/1/as/definitionsVoc.py deleted file mode 100644 index 05a2c750e1ea30cd90d36ee6749d6e338384fe6e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/as/definitionsVoc.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "LAB_MEMBERS": [ - ["Beat_Christen", "Beat Christen"], - ["Matthias_Christen", "Matthias Christen"], - ["Luca_Del_Medico", "Luca Del Medico"], - ["Dario_Cerletti", "Dario Cerletti"], - ["Flavia_Tschan", "Flavia Tschan"], - ["Carlos_Flores_Tinoco", "Carlos Flores Tinoco"], - ["Bo_Zhou", "Bo Zhou"], - ["Aaron_Abraham", "Aaron Abraham"], - ["Martha_Gerber", "Martha Gerber"], - ["Flora_Mauch", "Flora Mauch"], - ["Mike_Fero", "Mike Fero"] - ], - - "BC_STRAIN_RESISTANCE": [ - ["km", "km"], - ["tet", "tet"], - ["amp", "amp"], - ["chlor", "chlor"], - ["hyg", "hyg"], - ["strep", "strep"], - ["spec", "spec"], - ["carb", "carb"], - ["gent", "gent"], - ["nal", "nal"], - ["rif", "rif"], - ["apr", "apr"] - ], - - "KEYWORDS": [ - ["Tn5", "Tn5"], - ["Tn10", "Tn10"], - ["T-POP", "T-POP"], - ["mudK", "mudK"], - ["mudJ", "mudJ"], - ["mariner", "mariner"], - ["promotor_fusion", "promotor fusion"], - ["protein_fusion", "protein fusion"], - ["gfp_fusion", "gfp fusion"], - ["lacZ", "lacZ"], - ["phoA", "phoA"], - ["gus", "gus"], - ["neo", "neo"], - ["sacB", "sacB"], - ["His_tag", "His tag"] - ], - - "BC_STRAIN_SOURCE": [ - ["SGSC", "SGSC"], - ["Kelly_Hughes", "Kelly Hughes"], - ["Patrick_Viollier", "Patrick Viollier"], - ["Matthias", "Matthias"], - ["Andreas_Gassmann", "Andreas Gassmann"] - ], - - "BC_STRAIN_ORGANISM": [ - ["DH10B", "DH10B"], - ["SM10", "SM10"], - ["D5a", "D5a"], - ["BL21", "BL21"], - ["S17", "S17"], - ["LT2", "LT2"], - ["ccr", "ccr"], - ["Top10", "Top10"], - ["Top10F", "Top10F'"], - ["other_Eco", "other Eco"], - ["Sme", "Sme"], - ["phage", "phage"], - ["other", "other"] - ], - - "DNA_PURITY": [ - ["columne", "columne"], - ["gel", "gel"], - ["EtOH", "EtOH"], - - ], - - "PCR_POLYMERASE": [ - ["Taq", "Taq"], - ["Pfu", "Pfu"], - ["Pwo", "Pwo"], - ["high_fidelity", "high fidelity"] - - ], - - - "DNA_RESISTANCE": [ - ["km", "km"], - ["tet", "tet"], - ["amp", "amp"], - ["cm", "cm"], - ["hyg", "hyg"], - ["strep", "strep"], - ["spec", "spec"], - ["gent", "gent"] - - ], - - - "DNA_TYP": [ - ["gen_DNA", "gen DNA"], - ["PCR", "PCR"], - ["plasmid", "plasmid"], - ["insert", "insert"], - ["cosmid", "cosmid"] - - ], - - - "DNA_MODIFICATIONS": [ - ["Methylated", "Methylated"], - ["digested", "digested"], - ["SAPed", "SAPed"] - - ] - - - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/christenmigration/1/as/initialize-master-data.py b/plasmid/source/core-plugins/christenmigration/1/as/initialize-master-data.py deleted file mode 100644 index 4dd22faed4de64755b95463d6acea4c9e6180144..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/as/initialize-master-data.py +++ /dev/null @@ -1,223 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -## -## Configuration -## -#PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/juanf/Documents/workspace/openbis/source/core-plugins/petermigration/1/compatibility/"; -#PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/home/openbis/openbis/servers/core-plugins/christenmigration/1/compatibility/"; - -PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/barillac/openbis-christen/servers/core-plugins/christenmigration/1/compatibility/"; - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.createNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - -def createDataSetTypeWithProperties(dataSetCode, description, properties): - newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); - newDataSet.setDescription(description); - addProperties(newDataSet, properties); - -def createExperimentTypeWithProperties(experimentTypeCode, description, properties): - newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); - newExperiment.setDescription(description); - addProperties(newExperiment, properties); - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = samplesCache[sampleTypeCode]; - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - propertyCode = property[0]; - if propertyCode.startswith("-"): - continue - elif propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - - addProperty(entity, propertyCode, property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8]); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); - propertyAssignment.setSection(section); - propertyAssignment.setMandatory(isMandatory); - propertyAssignment.setShownEdit(True); - - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(False); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION -def createScript(path, name, description, scriptType, entityType): - scriptAsString = open(path, 'r').read(); - script = tr.getOrCreateNewScript(name); - script.setName(name); - script.setDescription(description); - script.setScript(scriptAsString); - script.setScriptType(scriptType); - script.setEntityForScript(entityType); - return script; - - -def createAnnotationsScriptForType(sampleTypeCode): - annotationsScriptName = None; - if PATH_TO_MANAGE_PROPERTIES_SCRIPTS != None: - annotationsScriptName = "ANNOTATIONS_" + sampleTypeCode; - annotationsScriptAsString = open(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "managed.py", 'r').read(); - annotationsScriptAsString = annotationsScriptAsString.replace("<REPLACE_WITH_ANNOTABLE_TYPE>", sampleTypeCode); - annotationsScript = tr.getOrCreateNewScript(annotationsScriptName); - annotationsScript.setName(annotationsScriptName); - annotationsScript.setDescription("Annotations Handler for " + sampleTypeCode); - annotationsScript.setScript(annotationsScriptAsString); - annotationsScript.setScriptType("MANAGED_PROPERTY"); - annotationsScript.setEntityForScript("SAMPLE"); - return annotationsScriptName; -## -## Managed properties scripts -## -commentsScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "comments.py", - definitions.commentsScriptName, - "Comments Handler", - "MANAGED_PROPERTY", - "SAMPLE"); - -## -## Dynamic properties scripts -## - - -boxLocationScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "box_location.py", - definitions.boxLocationScriptName, - "box location", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - -maxPlasmidMapIDScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "max_plasmid_map_id.py", - definitions.maxPlasmidMapIDScriptName, - "max plasmid map id", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -maxPlasmidIDScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "max_plasmid_id.py", - definitions.maxPlasmidIDScriptName, - "max plasmid id", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -PlasmidMapIDScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "plasmid_map_id.py", - definitions.PlasmidMapIDScriptName, - "plasmid map id", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - -slotScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "slot.py", - definitions.slotScriptName, - "slot", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -## -## Vocabulary Types -## -for vocabularyCode, vocabularyValues in definitionsVoc.vocabularyDefinitions.iteritems(): - createVocabularyWithTerms(vocabularyCode, vocabularyValues) - -## -## Experiment Types -## -#createExperimentTypeWithProperties("DEFAULT_EXPERIMENT", "Default Experiment", definitions.experimentDefinition); -#createExperimentTypeWithProperties("MATERIAL", "FOLDER FOR ORGANIZING MATERIALS SAMPLES", []); -#createExperimentTypeWithProperties("METHOD", "FOLDER FOR ORGANIZING METHODS SAMPLES", []); - -#createDatasetTypeWithProperties("SEQ_FILE", "Sequence fasta files", []); -createDataSetTypeWithProperties("SEQ_FILE", "Sequence fasta files", definitions.seqFileDefinition); -## -## Sample Types -## -annotationsScriptName = createAnnotationsScriptForType("STRAIN"); -createSampleTypeWithProperties("STRAIN", "", definitions.strainDefinition); -#=================================================================================================== -annotationsScriptName = createAnnotationsScriptForType("DNA"); -createSampleTypeWithProperties("DNA", "", definitions.DNADefinition); -annotationsScriptName = createAnnotationsScriptForType("OLIGO"); -createSampleTypeWithProperties("OLIGO", "", definitions.oligoDefinition); - -#=================================================================================================== - - - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/box_location.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/box_location.py deleted file mode 100644 index 5fa427e1008e88a753ef2701318d8e55800300e3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/box_location.py +++ /dev/null @@ -1,12 +0,0 @@ -import re - -def calculate_location(): - - plasmid_ID= float(entity.propertyValue('PLASMID_ID')) - location=(plasmid_ID/81)+0.499999 - round_location=int (round(location)) - - return round_location - -def calculate(): - return calculate_location() diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/comments.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/comments.py deleted file mode 100644 index 02c50d2364afd8bf0dce2d50297c6bff2ccb35bf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/comments.py +++ /dev/null @@ -1,174 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [COMMENT_ENTRY_ELEMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - comment_text_list = item.get('COMMENTENTRY') - sampleLink = _createCommentEntry(comment_text_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/managed.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/managed.py deleted file mode 100644 index 6d6312c0f92b6c8bcc7e59032b5bbad4d7005858..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/managed.py +++ /dev/null @@ -1,331 +0,0 @@ -from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider - -## -## Configuration -## - -# This needs to be edited for each sample type to match the Profile.js ANNOTATION_PROPERTIES map. -configuration = {} -configuration["MEDIA"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["SOLUTION_BUFFER"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["GENERAL_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False } - }; - -configuration["PCR_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["WESTERN_BLOTTING_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["PLASMID"] = { - "PLASMID" : {"COMMENTS" : False } - }; - -configuration["BACTERIA"] = { - "BACTERIA" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["YEAST"] = { - "YEAST" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False, "CONTAINED" : False } - }; - -configuration["CELL_LINE"] = { - "CELL_LINE" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False } - }; - -configuration["FLY"] = { - "FLY" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["EXPERIMENTAL_STEP"] = { - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False }, - "BACTERIA" : {"COMMENTS" : False }, - "CELL_LINE" : {"COMMENTS" : False }, - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "OLIGO" : {"COMMENTS" : False }, - "PLASMID" : {"COMMENTS" : False }, - "RNA" : {"COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "YEAST" : {"COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False }, - "PCR_PROTOCOL" : {"COMMENTS" : False }, - "WESTERN_BLOTTING_PROTOCOL" : {"COMMENTS" : False } - }; - -configurationCopyParents = {} -configurationCopyParents["YEAST"] = { "YEAST" : "PLASMID" }; - -#Global Variables -annotableType = "<REPLACE_WITH_ANNOTABLE_TYPE>" -propertyTypes = None -def getPropertyTypes(): - global propertyTypes - if propertyTypes is None: - server = CommonServiceProvider.getCommonServer() - contextOrNull = server.tryToAuthenticateAsSystem() - propertyTypes = server.listPropertyTypes(contextOrNull.getSessionToken(), False) - return propertyTypes; - -## -## Help Methods -## -def getAllAnnotableSampleTypesForType(fromAnnotableType): - allTypes = {}; - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - allTypes[sampleTypeWithAnnotationsForType] = True; - return allTypes; - -def getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCodeToFind, fromAnnotableType): - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - if sampleTypeWithAnnotationsForType == sampleTypeCodeToFind: - return configuration[sampleTypeWithAnnotations][sampleTypeWithAnnotationsForType]; - return None; - -def getPropertyType(propertyTypeCode): - for propertyType in getPropertyTypes(): - if propertyType.code == propertyTypeCode: - return propertyType - return None; - -def createAnnotationsFor(identifier, annotations, sampleType): - permId = entityInformationProvider().getSamplePermId(identifier); - newAnnotation = elementFactory().createSampleLink(permId) - - newAnnotation.addAttribute("identifier", identifier) - newAnnotation.addAttribute("sampleType", sampleType) - for annotation in annotations: - newAnnotation.addAttribute(annotation, annotations[annotation]) - return newAnnotation - -def getWidgetForAdd(sampleTypeCode, annotableType): - #print "sampleTypeCode:" + sampleTypeCode + " - " + annotableType #Deleting this comment causes the thing to break - widgets = [] - widgetIdentifier = inputWidgetFactory().createTextInputField("identifier")\ - .setMandatory(True)\ - .setValue("")\ - .setDescription("") - widgets.append(widgetIdentifier) - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - widget = inputWidgetFactory().createTextInputField(propertyType.label)\ - .setMandatory(getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType)[propertyTypeCode])\ - .setValue("")\ - .setDescription(propertyType.description) - widgets.append(widget) - return widgets; - -def isValid(dataType, value): - return True - -## -## Registration form (EXPERIMENTAL) -## - -# def inputWidgets(): -# print "EXECUTING inputWidgets START" -# widgetsToCopyFrom = [] -# if annotableType in configurationCopyParents: -# toCopyFrom = configurationCopyParents[annotableType] -# if(toCopyFrom is not None): -# for key in toCopyFrom: -# widgetLabel = key + " to copy " + toCopyFrom[key] -# print "EXECUTING inputWidgets key: " + widgetLabel -# widgetToCopyFrom = inputWidgetFactory().createTextInputField(widgetLabel).setMandatory(False) -# widgetsToCopyFrom.append(widgetToCopyFrom) -# print "EXECUTING inputWidgets " + str(len(widgetsToCopyFrom)) -# return widgetsToCopyFrom -# -# def updateFromRegistrationForm(bindings): -# print "EXECUTING updateFromaRegistrationForm" -# for key in bindings: -# print "MANAGED WITH KEY: " + str(key) - -## -## Main Methods -## -def configureUI(): - # Add Headers - tableBuilder = createTableBuilder() - tableBuilder.addHeader("identifier") - tableBuilder.addHeader("sampleType") - tableBuilder.addHeader("name") - - usedTableHeaders = {"identifier" : True, "sampleType" : True, "name" : True } - - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - if propertyTypeCode not in usedTableHeaders: - tableBuilder.addHeader(propertyTypeCode) - usedTableHeaders[propertyTypeCode] = True - - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - # Add Rows - samples = list(propertyConverter().convertToElements(property)) - for sample in samples: - row = tableBuilder.addRow() - permId = sample.getAttribute("permId") - - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "NAME") - if nameValue is not None: - row.setCell("name", nameValue) - - for annotation in sample.getAttributes(): - if annotation != "permId": - if annotation == "identifier": - row.setCell(annotation, sample, sample.getAttribute(annotation)) - else: - row.setCell(annotation, sample.getAttribute(annotation)) - - # Add Create buttons - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - title = "Add " + sampleTypeCode; - addAction = uiDescription.addTableAction(title).setDescription(title) - widgets = getWidgetForAdd(sampleTypeCode, annotableType) - addAction.addInputWidgets(widgets) - - # TO-DO Edit button for each type with different hooks to the columns depending on the type - # Add Edit Button (EXPERIMENTAL) -# editAction = uiDescription.addTableAction('Edit').setDescription('Edit selected table row') -# editAction.setRowSelectionRequiredSingle() -# editWidgets = [] -# for headerKey in usedTableHeaders: -# editWidgets.append(inputWidgetFactory().createTextInputField(headerKey)) -# editAction.addBinding(headerKey, headerKey) -# editAction.addInputWidgets(editWidgets) - - # Add Delete button - deleteAction = uiDescription.addTableAction("Delete")\ - .setDescription('Are you sure you want to delete selected annotation?') - deleteAction.setRowSelectionRequired() # Delete is enabled when at least 1 row is selected. - -def updateFromUI(action): - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - if action.name.startswith("Add"): - sampleTypeCode = action.name[4:] - identifier = action.getInputValue("identifier") - annotations = { } - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - propertyTypeValue = action.getInputValue(propertyType.label) - if not isValid(propertyType.dataType, propertyTypeValue): - raise ValidationException("Property " + str(propertyType.label) + " with invalid value " + str(propertyTypeValue)) - if propertyTypeValue is None: - propertyTypeValue = "" - annotations[propertyTypeCode] = propertyTypeValue - newAnnotation = createAnnotationsFor(identifier, annotations, sampleTypeCode) - elements.append(newAnnotation) - - if action.name.startswith("Delete"): - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - - property.value = converter.convertToString(elements) - -## -## Batch Import Methods -## -def batchColumnNames(): - allTypes = [] - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - allTypes.append(sampleTypeCode) - return allTypes - -def updateFromBatchInput(bindings): - #print "--------> UPDATE FROM BATCH INPUT: " - elements = [] - - #Links Configuration - typesToCopyFrom = [] - if annotableType in configurationCopyParents: - typesToCopyFrom = configurationCopyParents[annotableType] - - for annotableSampleType in getAllAnnotableSampleTypesForType(annotableType): - annotatedSamples = bindings.get(annotableSampleType) - #print "-----> TYPE: " + str(annotableSampleType) + " BINDINGS: " + str(annotatedSamples) - if (annotatedSamples != None and annotatedSamples != ""): - #Annotations - #print "-----> Annotations" - if annotableSampleType not in typesToCopyFrom: - for sampleLine in annotatedSamples.split("\\"): - propertyTypes = getPropertyTypesForSampleTypeFromAnnotableType(annotableSampleType, annotableType) - identifier = None - permId = None - sampleLink = None - for sampleProperty in sampleLine.split(";"): - propertyName = sampleProperty.split(":")[0] - propertyValue = sampleProperty.split(":")[1] - if propertyName == "identifier": - identifier = propertyValue - permId = entityInformationProvider().getSamplePermId(propertyValue) - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(propertyName, propertyValue) - sampleLink.addAttribute('sampleType', annotableSampleType) - elif propertyName in propertyTypes: - sampleLink.addAttribute(propertyName, propertyValue) - else: - raise NameError('Found invalid property: ' + propertyName + " on type " + annotableSampleType) - if identifier is not None: - elements.append(sampleLink) - #Links - #print "-----> links" - for typeToCopyFrom in typesToCopyFrom: - typeToCopy = typesToCopyFrom[typeToCopyFrom] - #print "-----> TYPE TO COPY FROM: " + str(typeToCopyFrom) - #print "-----> TYPE TO COPY: " + str(typeToCopy) - identifiersToCopyFrom = bindings.get(typeToCopyFrom) - if identifiersToCopyFrom is not None: - #print "-----> IDENTIFIERS TO COPY FROM: " + str(identifiersToCopyFrom) - identifiersForCopy = identifiersToCopyFrom.split(',') - for identifierToCopyFrom in identifiersForCopy: - #print "-----> IDENTIFIER TO COPY FROM: " + str(identifierToCopyFrom) - permIdFromIdentifier = entityInformationProvider().getSamplePermId(identifierToCopyFrom) - #print "-----> PERMID TO COPY FROM: " + str(permIdFromIdentifier) - parentsToCopyFromPermId = entityInformationProvider().getSamplePropertyValue(permIdFromIdentifier, "ANNOTATIONS_STATE") - #print "-----> ELEMENTS TO COPY: " + str(parentsToCopyFromPermId) - parentElements = list(propertyConverter().convertStringToElements(parentsToCopyFromPermId)) - for parentAnnotation in parentElements: - if parentAnnotation.getAttribute("sampleType") == typeToCopy: - parentAnnotation.addAttribute("CONTAINED", identifierToCopyFrom) - #print "-----> COPYING: " + str(parentAnnotation.getAttribute('identifier')) - elements.append(parentAnnotation) - property.value = propertyConverter().convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_id.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_id.py deleted file mode 100644 index fff8297cf08b4a8c7fc9c49d2ec5643ff30fca3d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_id.py +++ /dev/null @@ -1,10 +0,0 @@ -import re - -def calculate_maxID(): - - max_plasmid_id=max(entity.propertyValue('PLASMID_ID')) - - return max_plasmid_id - -def calculate(): - return calculate_maxID() diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_map_id.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_map_id.py deleted file mode 100644 index 96580860f4f32f96063ec96aaf01ecbea5e2dbb9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/max_plasmid_map_id.py +++ /dev/null @@ -1,10 +0,0 @@ -import re - -def calculate_maxID(): - - max_plasmid_map_id=max(entity.propertyValue('PLASMID_MAP_ID')) - - return max_plasmid_map_id - -def calculate(): - return calculate_maxID() diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/plasmid_map_id.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/plasmid_map_id.py deleted file mode 100644 index 57bb38670f1ed606b2fd26fa42fe76f1bb72f1c3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/plasmid_map_id.py +++ /dev/null @@ -1,10 +0,0 @@ -import re - -def calculate_mapID(): - - plasmid_map_id=max(entity.propertyValue('MAX_PLASMID_MAP_ID'))+1 - - return plasmid_map_id - -def calculate(): - return calculate_mapID() diff --git a/plasmid/source/core-plugins/christenmigration/1/compatibility/slot.py b/plasmid/source/core-plugins/christenmigration/1/compatibility/slot.py deleted file mode 100644 index 37943d553a7636a73fe89ac082c4470f3c71fdb8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/compatibility/slot.py +++ /dev/null @@ -1,22 +0,0 @@ -import re - -def calculate_slot(): - - plasmid_ID= float(entity.propertyValue('PLASMID_ID')) - location=(plasmid_ID/81)+0.499999 - round_location=int (round(location)) - - - - if (location > 1.1): - new_location=(round_location-1)*81 - slot = int(plasmid_ID-new_location) - else: - slot = int(plasmid_ID) - - return slot - -def calculate(): - return calculate_slot() - - diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitions.py b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitions.py deleted file mode 100644 index d968b20a1f86762deb0dbb134984f298de1388b6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitions.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Documentation -## -## Properties starting by "+" will be created in openBIS, but will not be read from FileMaker but if set programmatically will be put back in openBIS. -## Properties starting by "-" will not be created in openBIS but will be read from FileMaker. - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -annotationsScriptName="ANNOTATIONS" -boxLocationScriptName="BOX_LOCATION"; -maxPlasmidMapIDScriptName="MAX_PLASMID_MAP_ID" -maxPlasmidIDScriptName="MAX_PLASMID_ID" -slotScriptName="SLOT" -PlasmidMapIDScriptName="PLASMID_MAP_ID" - - -seqFileDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", "COMMENTS_DATA_SET", None,False] -]; - - -# -#Sample Types -# - - -strainDefinition = [ - ["NAME", "General", "plasmid name", DataType.VARCHAR, None, "", None, None, False], - ["BOX_LOCATION", "General", "box location", DataType.INTEGER, None, "", boxLocationScriptName, None, False], - ["CONSTRUCTION_METHOD", "General", "constructionMethod", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "CreationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "ModificationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["PLASMID_ID", "General", "plasmid_ID", DataType.INTEGER, None, "", None, None, False], - ["BC_STRAIN_RESISTANCE", "General", "resistance", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_RESISTANCE", "", None, None, False], - ["SEQUENCE", "General", "sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SLOT", "General", "slot", DataType.INTEGER, None, "", slotScriptName, None, False], - ["STRAIN_VECTOR", "General", "vector", DataType.VARCHAR, None, "", None, None, False], - ["KEYWORDS", "General", "keywords", DataType.CONTROLLEDVOCABULARY, "KEYWORDS", "", None, None, False], - ["BC_STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_SOURCE", "", None, None, False], - ["BC_STRAIN_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "BC_STRAIN_ORGANISM", "", None, None, False], - ["PUBLICATION", "References", "reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -oligoDefinition = [ - ["NAME", "General", "Primer_name", DataType.VARCHAR, None, "", None, None, False], - ["SEQUENCE", "General", "Primer_Sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["OLIGO_TARGET", "General", "Target", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["-PRIMER_NUMBER", "General", "Primer_number", DataType.INTEGER, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -DNADefinition = [ - ["NAME", "General", "plasmid name", DataType.VARCHAR, None, "", None, None, False], - ["BOX_LOCATION", "General", "box location", DataType.INTEGER, None, "", boxLocationScriptName, None, False], - ["CONSTRUCTION_METHOD", "General", "constructionMethod", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "CreationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "ModificationDate", DataType.TIMESTAMP, None, "", None, None, False], - ["PLASMID_ID", "General", "plasmid_ID", DataType.INTEGER, None, "", None, None, False], - ["DNA_SIZE", "General", "size", DataType.REAL, None, "", None, None, False], - ["RESTRICTION_ENZYME", "General", "Restriction enzymes", DataType.VARCHAR, None, "", None, None, False], - ["DNA_PURITY", "General", "purity", DataType.CONTROLLEDVOCABULARY, "DNA_PURITY", "", None, None, False], - ["PCR_POLYMERASE", "General", "PCR polymerase", DataType.CONTROLLEDVOCABULARY, "PCR_POLYMERASE", "", None, None, False], - ["DNA_TYP", "General", "DNA typ", DataType.CONTROLLEDVOCABULARY, "DNA_TYP", "", None, None, False], - ["DNA_MODIFICATIONS", "General", "DNA modifications", DataType.CONTROLLEDVOCABULARY, "DNA_MODIFICATIONS", "", None, None, False], - ["DNA_RESISTANCE", "General", "resistance", DataType.CONTROLLEDVOCABULARY, "DNA_RESISTANCE", "", None, None, False], - ["SEQUENCE", "General", "Sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SLOT", "General", "slot", DataType.INTEGER, None, "", slotScriptName, None, False], - ["DNA_VECTOR", "General", "vector", DataType.VARCHAR, None, "", None, None, False], - ["PUBLICATION", "References", "reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - - diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitionsVoc.py b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitionsVoc.py deleted file mode 100644 index 05a2c750e1ea30cd90d36ee6749d6e338384fe6e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/defs/definitionsVoc.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "LAB_MEMBERS": [ - ["Beat_Christen", "Beat Christen"], - ["Matthias_Christen", "Matthias Christen"], - ["Luca_Del_Medico", "Luca Del Medico"], - ["Dario_Cerletti", "Dario Cerletti"], - ["Flavia_Tschan", "Flavia Tschan"], - ["Carlos_Flores_Tinoco", "Carlos Flores Tinoco"], - ["Bo_Zhou", "Bo Zhou"], - ["Aaron_Abraham", "Aaron Abraham"], - ["Martha_Gerber", "Martha Gerber"], - ["Flora_Mauch", "Flora Mauch"], - ["Mike_Fero", "Mike Fero"] - ], - - "BC_STRAIN_RESISTANCE": [ - ["km", "km"], - ["tet", "tet"], - ["amp", "amp"], - ["chlor", "chlor"], - ["hyg", "hyg"], - ["strep", "strep"], - ["spec", "spec"], - ["carb", "carb"], - ["gent", "gent"], - ["nal", "nal"], - ["rif", "rif"], - ["apr", "apr"] - ], - - "KEYWORDS": [ - ["Tn5", "Tn5"], - ["Tn10", "Tn10"], - ["T-POP", "T-POP"], - ["mudK", "mudK"], - ["mudJ", "mudJ"], - ["mariner", "mariner"], - ["promotor_fusion", "promotor fusion"], - ["protein_fusion", "protein fusion"], - ["gfp_fusion", "gfp fusion"], - ["lacZ", "lacZ"], - ["phoA", "phoA"], - ["gus", "gus"], - ["neo", "neo"], - ["sacB", "sacB"], - ["His_tag", "His tag"] - ], - - "BC_STRAIN_SOURCE": [ - ["SGSC", "SGSC"], - ["Kelly_Hughes", "Kelly Hughes"], - ["Patrick_Viollier", "Patrick Viollier"], - ["Matthias", "Matthias"], - ["Andreas_Gassmann", "Andreas Gassmann"] - ], - - "BC_STRAIN_ORGANISM": [ - ["DH10B", "DH10B"], - ["SM10", "SM10"], - ["D5a", "D5a"], - ["BL21", "BL21"], - ["S17", "S17"], - ["LT2", "LT2"], - ["ccr", "ccr"], - ["Top10", "Top10"], - ["Top10F", "Top10F'"], - ["other_Eco", "other Eco"], - ["Sme", "Sme"], - ["phage", "phage"], - ["other", "other"] - ], - - "DNA_PURITY": [ - ["columne", "columne"], - ["gel", "gel"], - ["EtOH", "EtOH"], - - ], - - "PCR_POLYMERASE": [ - ["Taq", "Taq"], - ["Pfu", "Pfu"], - ["Pwo", "Pwo"], - ["high_fidelity", "high fidelity"] - - ], - - - "DNA_RESISTANCE": [ - ["km", "km"], - ["tet", "tet"], - ["amp", "amp"], - ["cm", "cm"], - ["hyg", "hyg"], - ["strep", "strep"], - ["spec", "spec"], - ["gent", "gent"] - - ], - - - "DNA_TYP": [ - ["gen_DNA", "gen DNA"], - ["PCR", "PCR"], - ["plasmid", "plasmid"], - ["insert", "insert"], - ["cosmid", "cosmid"] - - ], - - - "DNA_MODIFICATIONS": [ - ["Methylated", "Methylated"], - ["digested", "digested"], - ["SAPed", "SAPed"] - - ] - - - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/doc/fm11_odbc_jdbc_guide_en.pdf b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/doc/fm11_odbc_jdbc_guide_en.pdf deleted file mode 100644 index 36aaa0f12220dbde26b7ece4e3b78914087893b0..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/doc/fm11_odbc_jdbc_guide_en.pdf and /dev/null differ diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/FileMakerMain.java deleted file mode 100644 index a2206338c1ccb79267396fbe2751fbb529304ab8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/FileMakerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - - -// STEP By Step: -// 1. Open the file maker file with file maker pro -// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on -// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" -// Without closing file maker pro you can run this script, modify it as needed -// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf - -public class FileMakerMain -{ - // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this - public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; - public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; - - static class Document { - String fileName; - String info; - String serial; - - public String toString() - { - return fileName + " " + info; - } - } - - public static List<Document> getDocuments(Connection connection) throws SQLException { - List<Document> documents = new ArrayList<Document>(); - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); - ResultSet result = preparedStatement.executeQuery(); - - while(result.next()) { - Document document = new Document(); - document.fileName = result.getString("fileName"); - document.info = result.getString("info"); - document.serial = result.getString("serial"); - documents.add(document); - } - result.close(); - preparedStatement.close(); - return documents; - } - - public static byte[] getFile(Connection connection, Document document) throws SQLException { - byte[] bytes = {}; - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); - preparedStatement.setString(1, document.serial); - ResultSet result = preparedStatement.executeQuery(); - if(result.next()) { - byte[] value = result.getBytes("fileData"); - if(value != null) { - bytes = value; - } - } - result.close(); - preparedStatement.close(); - return bytes; - } - - public static void main(String[] args) throws Exception { - Class.forName("com.filemaker.jdbc.Driver").newInstance(); - Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); - - for(Document document: getDocuments(connection)) { - byte[] bytes = getFile(connection, document); - System.out.println(document + " " + bytes.length); - } - connection.close(); - } -} diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/fmjdbc.jar b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/fmjdbc.jar deleted file mode 100644 index 34cae1d60b916205b9039fe765c971229cef1a32..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/lib/fmjdbc.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/migration.py b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/migration.py deleted file mode 100644 index 5906aabd80d4fcc08eb5a533fb0421db7c1fb9aa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/migration.py +++ /dev/null @@ -1,488 +0,0 @@ -# some_file.py -import sys -import traceback -import definitions -import definitionsVoc -import re -import random -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -import java.lang.Class as Class -import java.sql.DriverManager as DriverManager - - -## -## Generic Process Method -## -notMigratedEntities = { - "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} - } - -def getStringValueOrNone(map, key): - if (key in map) and (map[key] is not None) and (map[key] is not ""): - return map[key]; - else: - return None; - -def addNotMigratedEntity(type, entityID, error): - if type not in notMigratedEntities: - notMigratedEntities[type] = {} - if entityID not in notMigratedEntities[type]: - notMigratedEntities[type][entityID] = {} - if error not in notMigratedEntities[type][entityID]: - notMigratedEntities[type][entityID][error] = 1 - else: - notMigratedEntities[type][entityID][error] += 1 - -def printNotMigratedEntities(): - print "--- Not Migrated Entities Report" - for type in notMigratedEntities: - print "Type: [" + str(type) + "]" - for id in notMigratedEntities[type]: - for error in notMigratedEntities[type][id]: - print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) - print "---" - -def process(tr): - print "START!" - #createDataHierarchy(tr) - #tr.createNewProject("/MATERIALS/STRAINS") - #tr.createNewProject("/MATERIALS/DNA") - for adaptor in adaptors: - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" - - if adaptor.__class__.__name__ == "PlasmidParentAdaptor": - print "check hack, dont do please" - adaptor.init(); - - while adaptor.next(): - entity = adaptor.getEntity() - print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" - try: - if not entity.isInOpenBIS(tr): - entity.write(tr) - else: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") - except Exception, error: - print traceback.format_exc() - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) - #print entity.getIdentifier(tr) + " - Already up to date" - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" - print "REPORT START" - printNotMigratedEntities() - definitionsVoc.printCreatedTerms() - print "REPORT FINISH" - print "FINISH!" -## -## Help Methods -## -def setEntityProperties(tr, definition, entity, properties): - for origPropertyCode, propertyValue in properties.iteritems(): - #print repr("setEntityProperties " + origPropertyCode + " : " + unicode(propertyValue)) - propertyCode = origPropertyCode; - if propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - elif propertyCode.startswith("-"): - continue - - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, origPropertyCode) - #print "Prop definition ", propertyDefinition - #print "PROP VALUE ", propertyValue - if propertyDefinition is not None and propertyValue is not None: - propertyValue = unicode(propertyValue) - - if propertyDefinition is not None and propertyDefinition[3] == DataType.REAL and propertyValue is not None: - if propertyValue =="?": - propertyValue="" - - if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue - else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 50: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - #print "NEW CODE", propertyValue - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - -## -## Generic Pattern -## -class EntityAdaptor: - entities = None - entitiesIdx = None - definition = None - definitionRepeats = None - - def init(self): - self.entities = [] - self.entitiesIdx = -1 - pass - - def next(self): - if self.entities is None and self.entitiesIdx is None: - self.init() - self.entitiesIdx += 1 - if len(self.entities) > self.entitiesIdx: - return True - else: - return False - - def addEntity(self, values): - self.entities.append(OpenBISDTO(values, self.definition)) - - def getEntity(self): - return self.entities[self.entitiesIdx] - -class OpenBISDTO: - values = {} - definition = None - - def __init__(self, values, definition): - self.values = values - self.definition = definition - - def getIdentifier(self, tr): - pass - - def isInOpenBIS(self, tr): - pass - - def write(self, tr): - pass - -## -## Costumer specific logic: generic part -## -experimentCache = {} -sampleCache = {} -sampleID2Sample = {} -globalSequences = {}; - -def getNextGlobalSequence(id, startingAt): - currentSequence = None; - - if id in globalSequences: - currentSequence = globalSequences[id]; #Get existing sequence - else: - if startingAt is not None: - currentSequence = startingAt; - else: - currentSequence = 0; # Create a new one - - #Advance and store new step on the sequence - currentSequence = currentSequence+1; - globalSequences[id] = currentSequence; - - #Return the new sequence number - return str(currentSequence); - -def getExperimentForUpdate(experimentIdentifier, experimentType, tr): - experimentType ="MATERIALS" - if experimentIdentifier not in experimentCache: - print "Cache failed " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.getExperimentForUpdate(experimentIdentifier) - if experiment is None and experimentType is not None: - print "Cache Create " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.createNewExperiment(experimentIdentifier, experimentType) - if experiment is not None: - experimentCache[experimentIdentifier] = experiment - else: - pass - #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) - if experimentIdentifier not in experimentCache: - return None - else: - return experimentCache[experimentIdentifier] - -def getSampleForUpdate(sampleIdentifier, sampleType, tr): - if sampleIdentifier not in sampleCache: - #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) - sample = tr.getSampleForUpdate(sampleIdentifier) - if sample is None and sampleType is not None: - #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) - if sampleType == "STRAIN": - experiment = getExperimentForUpdate("/MATERIALS/STRAINS/STRAIN_COLLECTION_1", sampleType, tr) - elif sampleType == "DNA": - experiment = getExperimentForUpdate("/MATERIALS/DNA/DNA_COLLECTION_1", sampleType, tr) - elif sampleType == "OLIGO": - experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1", sampleType, tr) - sample = tr.createNewSample(sampleIdentifier, sampleType) - sample.setExperiment(experiment) - if sample is not None: - sampleCache[sampleIdentifier] = sample - else: - pass - #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) - - if sampleIdentifier not in sampleCache: - raise None - else: - return sampleCache[sampleIdentifier] - -class FileMakerEntityAdaptor(EntityAdaptor): - connection = None - selectQuery = None - selectQueryRepetitions = None; - selectQueryRepetitionsId = None; - - def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): - Class.forName("com.filemaker.jdbc.Driver").newInstance() - self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) - - def init(self): - EntityAdaptor.init(self) - - # Default Query (All adaptors should have it) - preparedStatement = self.connection.prepareStatement(self.selectQuery) - #print "EXECUTED QUERY: " + self.selectQuery - result = preparedStatement.executeQuery() - - while result.next(): - values = {} - for property in self.definition: - if property[0].startswith("+"): - pass #Do Nothing - elif property[0]=="ANNOTATIONS_STATE": - values[property[0]] = ""; - else: - propertyCode = property[0]; - #print "propertyCode IS: ", propertyCode - propertyValue = result.getString(property[2]); - if property[0].startswith("+"): - propertyCode = property[0][1:]; - if property[0].startswith("-"): - propertyCode = property[0][1:]; - values[propertyCode] = result.getString(property[2]) - self.addEntity(values) - result.close() - preparedStatement.close() - # Repetitions Query (Optional) - - #Extra Repeats Logic - if self.definitionRepeats is not None: - fields = ""; - fieldsNames = []; - isFirst = True; - for field in self.definitionRepeats: - propertyCode = field[0]; - if propertyCode.startswith("+"): - continue - - if not isFirst: - fields = fields + ", "; - - fields = fields + field[2]; - fieldsNames.append(propertyCode); - isFirst = False; - - for entity in self.entities: - entityId = entity.values[self.selectQueryRepetitionsId]; - if entityId is not None: - perEntityQuery = "SELECT " + fields + " FROM " + self.selectQueryRepetitions + "= '" + entityId + "'"; - #print "EXECUTED QUERY: " + perEntityQuery - preparedStatement = self.connection.prepareStatement(perEntityQuery) - result = preparedStatement.executeQuery() - - columnCount = result.getMetaData().getColumnCount(); - while result.next(): - for cIdx in range(columnCount): - if cIdx is not 0: - columName = result.getMetaData().getColumnName(cIdx); - fieldName = fieldsNames[cIdx]; - entity.values[fieldName] = result.getString(cIdx); - result.close() - preparedStatement.close() - # - -## -## Customer specific logic: different sample types -## -class FMOpenBISDTO(OpenBISDTO): - def isSampleCacheable(self): - return True - - def isInOpenBIS(self, tr): - return False - # code = self.getIdentifier(tr) - # if (code is not None) and (' ' not in code): - # if self.isSampleCacheable(): - # sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) - # if (self.values["NAME"] is not None and len(self.values["NAME"]) > 0 and self.values["NAME"] not in sampleID2Sample): - # print "Cached Sample with name: '" + self.values["NAME"] + "' for '" + "/MATERIALS/" + code + "' in dict with size: " + str(len(sampleID2Sample)) - # parentName = unicode(self.values["NAME"], "utf-8"); - # sampleID2Sample[parentName] = sample - # return False - # else: - # print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" - # raise Exception('Invalid Code found ' + str(code)) - - -## -## Strains -## - -globalStrainsCodeCheck = {}; - -class StrainAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"BCstrains_ETH\"" - - self.definition = definitions.strainDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(StrainOpenBISDTO(values, self.definition)) - -class StrainOpenBISDTO(FMOpenBISDTO): - code = None; - - def isSampleCacheable(self): - return False - - def write(self, tr): - code = self.getIdentifier(tr); - - sample = getSampleForUpdate("/MATERIALS/"+code,"STRAIN", tr) - setEntityProperties(tr, self.definition, sample, self.values) - - - def getIdentifier(self, tr): - if self.code is not None: - return self.code; - elif (self.values["PLASMID_ID"] is not None and self.values["PLASMID_ID"] not in globalStrainsCodeCheck): - self.code = "BC" + self.values["PLASMID_ID"] - globalStrainsCodeCheck[self.values["PLASMID_ID"]] = True - else: - nextNum = getNextGlobalSequence("BC", 0) - self.code = "BC_missing_" + nextNum; - globalStrainsCodeCheck[nextNum] = True - return self.code - - - -## -## DNA -## - - - -globalDNACodeCheck = {}; - -class DNAAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"Plasmids\"" - - self.definition = definitions.DNADefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(DNAOpenBISDTO(values, self.definition)) - -class DNAOpenBISDTO(FMOpenBISDTO): - code = None; - - def isSampleCacheable(self): - return False - - def write(self, tr): - code = self.getIdentifier(tr); - - sample = getSampleForUpdate("/MATERIALS/"+code,"DNA", tr) - setEntityProperties(tr, self.definition, sample, self.values) - - - def getIdentifier(self, tr): - if self.code is not None: - return self.code; - elif (self.values["PLASMID_ID"] is not None and self.values["PLASMID_ID"] not in globalDNACodeCheck): - self.code = "DNA" + self.values["PLASMID_ID"] - globalDNACodeCheck[self.values["PLASMID_ID"]] = True - else: - nextNum = getNextGlobalSequence("DNA", 0) - self.code = "DNA_missing_" + nextNum; - globalDNACodeCheck[nextNum] = True - return self.code - - - -## -## Oligos -## -class OligoAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"Oligo_Beat\"" - self.definition = definitions.oligoDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(OligoOpenBISDTO(values, self.definition)) - -class OligoOpenBISDTO(FMOpenBISDTO): - def write(self, tr): - code = "OLI" + self.values["PRIMER_NUMBER"]; - print "CODE IS:", code - if code is not None: - print "/MATERIALS/"+code - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - setEntityProperties(tr, self.definition, sample, self.values) - else: - print "OLIGO CODE NOT FOUND! " - - def getIdentifier(self, tr): - code="" - if (self.values["PRIMER_NUMBER"] is not None): - code = "OLI" + self.values["PRIMER_NUMBER"] - else: - code = "OLI" + getNextGlobalSequence("OLI", None); - return code - - -#filemaker on DBIOL servers -fmConnString = "jdbc:filemaker://fmsrv.ethz.ch/" - -#localhost -#fmConnString = "jdbc:filemaker://127.0.0.1/" -fmUser= "admin" -fmPass = "filegod64+" - - - -adaptors = [ - #OligoAdaptor(fmConnString, fmUser, fmPass, "Christen_Oligo_Collection"), - #DNAAdaptor(fmConnString, fmUser, fmPass, "Christen_DNA_collection"), - StrainAdaptor(fmConnString, fmUser, fmPass, "Christen_BCstrains_ETH_2014_1") - ] - - - - - -# def createDataHierarchy(tr): -# DNAProject = tr.getProject("/MATERIALS/DNA") -# if DNAProject == None: -# tr.createNewProject("/MATERIALS/STRAINS") -# tr.createNewProject("/MATERIALS/DNA") -# else: -# pass diff --git a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/plugin.properties b/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/plugin.properties deleted file mode 100644 index d39e7e7ab4183de0275c56da466a7032aa8d126a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/christenmigration/1/dss/drop-boxes/christenmigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = christenmigration -incoming-dir = ${root-dir}/christenmigration diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BSAProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BSAProfile.js deleted file mode 100644 index 8e1961a78478e504927db02b1d5930dbd26f28ed..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BSAProfile.js +++ /dev/null @@ -1,110 +0,0 @@ - -function BSAProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(BSAProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "DEFAULT_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMISTRY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cloning insert", - "TYPE": "CLONING_INSERT", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cloning vector", - "TYPE": "CLONING_VECTOR", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Linearised vector", - "TYPE": "LINEARIZED_VECTOR", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Vector", - "TYPE": "VECTOR", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Molecular biology", - "TYPE": "MOLECULAR_BIOLOGY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Primer", - "TYPE": "PRIMER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - - ] - } - - } - - -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BioATProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BioATProfile.js deleted file mode 100644 index bb14f0f04998284fa29981a525b6cff3a3a7c646..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BioATProfile.js +++ /dev/null @@ -1,23 +0,0 @@ -function BioATProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(BioATProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - //Put on this list all experiment types, ELN experiments need to have both an experiment type and a sample type with the same CODE. - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - - //Black list, put on this list all types that you don�t want to appear on the menu and the ELN experiments. - this.notShowTypes = ["SYSTEM_EXPERIMENT", "COMPOUND", "CONTROL_WELL", "LIBRARY", "ORF", "ORF_WELL", "SHRNA", "SHRNA_WELL", "SIRNA", "SIRNA_WELL", "UNKNOWN"]; - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; - - //The configuration for the visual storages. - this.storagesConfiguration = { - "isEnabled" : false - }; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BodenmillerLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BodenmillerLabProfile.js deleted file mode 100644 index 006122037f335e6e61a3a83630a5b433500589ea..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/BodenmillerLabProfile.js +++ /dev/null @@ -1,71 +0,0 @@ -function BodenmillerLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(BodenmillerLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - this.notShowTypes = ["ANTIBODY_PANEL", "SYSTEM_EXPERIMENT"]; - this.isShowUnavailablePreviewOnSampleTable = false; - this.inventorySpaces = ["BODENMILLER_LAB"]; - - /* - * Used by Sample Form - */ - this.getSpaceForSampleType = function(type) { - if(type === "PROTEIN") { - return "BODENMILLER_LAB"; - } else if(type === "CLONE") { - return "BODENMILLER_LAB"; - } else if(type === "CONJUGATED_CLONE") { - return "BODENMILLER_LAB"; - } else if(type === "LOT") { - return "BODENMILLER_LAB"; - } else if(type === "CHEMICALS") { - return "BODENMILLER_LAB"; - } else if(type === "CELL_LINES") { - return "BODENMILLER_LAB"; - } else { - return null; - } - } - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "PROTEIN") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CLONE") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CONJUGATED_CLONE") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "LOT") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CHEMICALS") { - return "/BODENMILLER_LAB/CHEMICALS/CHEMICALS"; - } else if(type === "CELL_LINES") { - return "/BODENMILLER_LAB/CELL_LINES/CELL_LINES"; - } else { - return null; - } - } - - /* - * Used by Main Menu - */ - this.mainMenuContentExtra = function() { - return "<center><h5><i class='icon-info-sign'></i> Please log in into your google account on the brower to see your laboratory calendar.</h5></center><br /><iframe src='https://www.google.com/calendar/embed?src=kcm620topcrg5677ikbn5epg0s%40group.calendar.google.com&ctz=Europe/Zurich' margin-left = '20' style='border: 50' width='800' height='600' frameborder='0' scrolling='no'></iframe>"; - } - - /* - * Used by Sample Form - */ - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "ANTIBODY_PANEL") { - var isEnabled = mainController.currentView.mode !== SampleFormMode.VIEW; - var dilutionWidget = new DilutionWidget(containerId, this.serverFacade, isEnabled); - dilutionWidget.init(); - } - } - } -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CaterinaTestProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CaterinaTestProfile.js deleted file mode 100644 index b3d4d37eff5f6b33fc1e921a38e50c140e0199b2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CaterinaTestProfile.js +++ /dev/null @@ -1,115 +0,0 @@ - -function CaterinaTestProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(CaterinaTestProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.inventorySpaces = ["INVENTORY"]; - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }, - { - "STORAGE_PROPERTY_GROUP" : "Storage 2", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 2", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME_2", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW_2", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN_2", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER_2", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY_2" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "MINUS80_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS820_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOLS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMIDS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITORS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - } - } - - - //The properties you want to appear on the tables, if you don«t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; - - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "FACS") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } -// if(sampleTypeCode === "SYSTEM_EXPERIMENT") { -// var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; -// var dilutionWidgetController = new DilutionTableController(sample, isEnabled); -// dilutionWidgetController.init($("#" + containerId)); -// } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CiaudoLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CiaudoLabProfile.js deleted file mode 100644 index 79d8f20929e712635946202a93981a1050e1815e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/CiaudoLabProfile.js +++ /dev/null @@ -1,113 +0,0 @@ - -function CiaudoLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(CiaudoLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - - //Use this with all known types to create groups, if a type is not specified by default will be added to the OTHERS group. - this.inventorySpaces = ["ANTIBODIES", "CELLS", "ENZYMES", "EQUIPMENT", "LAB_MEETINGS", "PLASMIDS", "PRIMERS", "PROTOCOLS", "RESTRICTION_ENZYMES"]; - this.isShowUnavailablePreviewOnSampleTable = true; - - this.getSpaceForSampleType = function(type) { - if(type === "ANTIBODIES") { - return "ANTIBODIES"; - } else if(type === "PLASMIDS") { - return "PLASMIDS"; - } else if(type === "STRAINS") { - return "PLASMIDS"; - } else if(type === "PRIMERS") { - return "PRIMERS"; - } else if(type === "CELLS") { - return "CELLS"; - } else if(type === "ENZYMES") { - return "ENZYMES"; - } else if(type === "PROTOCOLS") { - return "PROTOCOLS"; - } else if(type === "LAB_MEETINGS") { - return "LAB_MEETINGS"; - } else if(type === "EQUIPMENT") { - return "EQUIPMENT"; - } else { - return null; - } - } - - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "LAB_MEETINGS") { - return "/LAB_MEETINGS/LAB_MEETINGS/LAB_MEETINGS"; - } else if(type === "PROTOCOLS") { - return "/PROTOCOLS/PROTOCOLS/PROTOCOLS"; - } else if(type === "ANTIBODIES") { - return "/ANTIBODIES/ANTIBODIES/ANTIBODIES"; - } else if(type === "CELLS") { - return "/CELLS/CELLS/CELLS"; - } else if(type === "ENZYMES") { - return "/ENZYMES/ENZYMES/ENZYMES"; - } else if(type === "EQUIPMENT") { - return "/EQUIPMENT/EQUIPMENT/EQUIPMENT"; - } else if(type === "PLASMIDS") { - return "/PLASMIDS/PLASMIDS/PLASMIDS"; - } else if(type === "STRAINS") { - return "/PLASMIDS/PLASMIDS/STRAINS"; - } else if(type === "PRIMERS") { - return "/PRIMERS/PRIMERS/PRIMERS"; - } else if(type === "RESTRICTION_ENZYMES") { - return "/RESTRICTION_ENZYMES/RESTRICTION_ENZYMES/RESTRICTION_ENZYMES"; - } else { - return null; - } - } - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "MINUS80" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "RT" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - - - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DeBockLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DeBockLabProfile.js deleted file mode 100644 index bad722f6dfaad0d3ee3fa4d2534f0495180cd8c2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DeBockLabProfile.js +++ /dev/null @@ -1,340 +0,0 @@ - -function DeBockLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(DeBockLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - this.inventorySpaces = ["MATERIALS", "METHODS", "EQUIPMENT"]; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "PCR_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast parents", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ] - }, - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Parental fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - "MOUSE_CROSSING" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Mouse line", - "TYPE": "MOUSE_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "RNA", - "TYPE": "RNA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "PCR protocol", - "TYPE": "PCR_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Western blotting protocol", - "TYPE": "WESTERN_BLOTTING_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - - - - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DittrichLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DittrichLabProfile.js deleted file mode 100644 index 46a7e0322ccecd9566127e6408ed8448d1dd4562..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/DittrichLabProfile.js +++ /dev/null @@ -1,317 +0,0 @@ - -function DittrichLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(DittrichLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "PCR_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast parents", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ] - }, - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Parental fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "CHIP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Mask", - "TYPE": "MASK", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chip", - "TYPE": "CHIP", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Fluorophore", - "TYPE": "FLUOROPHORE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } -} -}) \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ELNPaperProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ELNPaperProfile.js deleted file mode 100644 index 56205659ca9b997e4512132a6efc426710f0d4d6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ELNPaperProfile.js +++ /dev/null @@ -1,410 +0,0 @@ - -function ELNPaperProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(ELNPaperProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.hideCodes = true; - - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_A1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_A2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_A1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE1_A1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE2_A1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "RT_A3" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "PCR_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast parents", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - "SAMPLE_PARENTS_ANNOTATIONS_COPY" : { "YEAST" : ["PLASMID"] } - }, - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Parental fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "RNA", - "TYPE": "RNA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "PCR protocol", - "TYPE": "PCR_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Western blotting protocol", - "TYPE": "WESTERN_BLOTTING_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "EXPERIMENTAL_STEP") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } - } - - - this.getDataSetTypeForFileName = function(allDatasetFiles, fileName) { - if(fileName.endsWith("gb") || fileName.endsWith("fasta") || fileName.endsWith("xdna") || fileName.endsWith("fa")) { - return "SEQ_FILE"; - } else if(fileName.endsWith("ab1")) { - return "RAW_DATA"; - } else { - return null; - } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/EveProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/EveProfile.js deleted file mode 100644 index 9d2fd0d07e73693abfe81015028e567f86de3132..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/EveProfile.js +++ /dev/null @@ -1,65 +0,0 @@ - - -function EveProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(EveProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - this.inventorySpaces = ["TB", "EB"]; - - this.storagesConfiguration = { - "isEnabled" : true, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }, - { - "STORAGE_PROPERTY_GROUP" : "Physical Storage 2", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage 2", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES_2", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW_2", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN_2", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME_2", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE_2", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER_2", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION_2" //Should be text. - } - - ], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "KAE93" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "KAE69" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - - } - }; - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ExampleProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ExampleProfile.js deleted file mode 100644 index 66931204daac74529e7b962d984e12a723ee4588..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/ExampleProfile.js +++ /dev/null @@ -1,24 +0,0 @@ -//Example profile with basic configuration that don�t requires any programming -function ExampleProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(ExampleProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - //Put on this list all experiment types, ELN experiments need to have both an experiment type and a sample type with the same CODE. - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - - //Black list, put on this list all types that you don�t want to appear on the menu and the ELN experiments. - this.notShowTypes = ["SYSTEM_EXPERIMENT"]; - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; - - //The configuration for the visual storages. - this.storagesConfiguration = { - "isEnabled" : false - }; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/KrekLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/KrekLabProfile.js deleted file mode 100644 index 753e689ce49221c0b5963ad6d73ef64277b5efd1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/KrekLabProfile.js +++ /dev/null @@ -1,119 +0,0 @@ - -function KrekLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(KrekLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - - //Use this with all known types to create groups, if a type is not specified by default will be added to the OTHERS group. - this.inventorySpaces = ["INVENTORY"]; - this.isShowUnavailablePreviewOnSampleTable = true; - - this.getSpaceForSampleType = function(type) { - if(type === "ANTIBODY") { - return "INVENTORY"; - } else if(type === "PLASMID") { - return "INVENTORY"; - } else if(type === "INHIBITOR") { - return "INVENTORY"; - } else if(type === "CELL_LINE") { - return "INVENTORY"; - } else { - return null; - } - } - - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "ANTIBODY") { - return "/INVENTORY/SAMPLES/ANTIBODIES"; - } else if(type === "PLASMID") { - return "/INVENTORY/SAMPLES/PLASMIDS"; - } else if(type === "INHIBITOR") { - return "/INVENTORY/SAMPLES/INHIBITORS"; - } else if(type === "CELL_LINE") { - return "/INVENTORY/SAMPLES/CELL_LINES"; - } else { - return null; - } - } - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "H20.1_KREK-1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "H20.2_KREK-2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOLS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMIDS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITORS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - } - } - - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LSILabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LSILabProfile.js deleted file mode 100644 index 70da5bd74fd5c738c2a614bbb3acdbc2c73948de..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LSILabProfile.js +++ /dev/null @@ -1,228 +0,0 @@ -function LSILabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(LSILabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - - this.notShowTypes = ["SYSTEM_EXPERIMENT", "ILLUMINA_FLOW_CELL", "ILLUMINA_FLOW_LANE", "LIBRARY", "LIBRARY_POOL", "MASTER_SAMPLE","MS_INJECTION","RAW_SAMPLE","TEMPLATE_SAMPLE", "SEARCH"]; - - this.typePropertiesForTable = { - "SYSTEM_EXPERIMENT" : ["NAME", "GOALS", "RESULT_INTERPRETATION"], - "GENERAL_PROTOCOL" : ["NAME", "FOR_WHAT", "PROTOCOL_TYPE"], - "PCR" : ["NAME", "FOR_WHAT", "TEMPLATE", "PUBLICATION"], - "WESTERN_BLOTTING" : ["NAME", "FOR_WHAT", "STORAGE"], - "CHEMICAL" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE"], - "ANTIBODY" : ["NAME", "STORAGE", "HOST", "FOR_WHAT"], - "MEDIA" : ["NAME", "STORAGE", "FOR_WHAT", "ORGANISM"], - "SOLUTIONS_BUFFERS" : ["NAME", "STORAGE", "FOR_WHAT"], - "ENZYME" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "KIT"], - "OLIGO" : ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "PROJECT"], - "PLASMID" : ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER"], - "YEAST" : ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "PROJECT", "GENETIC_BACKGROUND", "MATING_TYPE", "FREEZER_NAME", "ROW", "COLUMN", "BOX_NUMBER"], - "BACTERIA" : ["BACTERIA_STRAIN_NAME", "BACTERIA_GENOTYPE", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "COMMENTS"] - } - - /* - * Used by Sample Form - */ - this.getSpaceForSampleType = function(type) { - if(type === "SEQUENCING") { - return "LSI"; - } else if(type === "PRIMARY_ANTIBODIES") { - return "LSI"; - } else if(type === "BACTERIA") { - return "LSI"; - } else if(type === "ENZYME") { - return "LSI"; - } else if(type === "CHEMICAL") { - return "LSI"; - } else if(type === "ANTIBODY") { - return "LSI"; - } else if(type === "OLIGO") { - return "LSI"; - } else if(type === "PLASMID") { - return "LSI"; - } else if(type === "WESTERN_BLOTTING") { - return "LSI"; - } else if(type === "READOUT") { - return "LSI"; - } else if(type === "PCR") { - return "LSI"; - } else if(type === "GENERAL_PROTOCOL") { - return "LSI"; - } else if(type === "YEAST") { - return "LSI"; - } else if(type === "POMBE") { - return "LSI"; - } else { - return null; - } - } - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "BACTERIA") { - return "/LSI/BACTERIA/LAB_BENCH_BACTERIA"; - } else if(type === "SOLUTIONS_BUFFERS") { - return "/LSI/CHEMICALS/SOLUTIONS_BUFFERS"; - } else if(type === "MEDIA") { - return "/LSI/CHEMICALS/MEDIA"; - } else if(type === "ENZYME") { - return "/LSI/CHEMICALS/ENZYMES"; - } else { - return null; - } - } - - this.getHTMLTableFromXML = function(xmlDocument) { - var table_head = null; - var table_body = ""; - var dom; - - if (window.DOMParser) { - parser = new DOMParser(); - dom = parser.parseFromString(xmlDocument,"text/xml"); - } else {// Internet Explorer - dom = new ActiveXObject("Microsoft.XMLDOM"); - dom.async = false; - dom.loadXML(xmlDocument); - } - - var html = null; - var root = dom.childNodes[0]; - var children = root.childNodes; - for(var i = 0; i < children.length; i++) { - var child = children[i]; - if (child.localName != null) { - var keys = child.attributes; - if (table_head == null) { - table_head = "<tr>"; - var key = null; - for (var j = 0; j < keys.length; j++) { - key = keys[j]; - if(key.localName != "permId") { - table_head += "<th style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>"+ key.localName + "</th>"; - } - } - table_head += "</tr>"; - } - table_body += "<tr>"; - for (var j = 0; j < keys.length; j++) { - key = keys[j]; - if(key.localName != "permId") { - if(key.localName == "date") { - table_body += "<td style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>" + key.value + "</td>"; - } else { - table_body += "<td style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>" + key.value + "</td>"; - } - } - } - table_body += "</tr>"; - } - } - html = "<table style='font-family:helvetica; font-size:90%; width: 100%;'><thead>" + table_head + "</thead><tbody>"+ table_body + "</tbody></table>"; - return html; - } - - this.inspectorContentTransformer = function(sample, propertyCode, propertyContent) { - - if(propertyContent.indexOf("<root>") != -1) { - return { - "isSingleColumn" : true, - "content" : this.getHTMLTableFromXML(propertyContent) - }; - } else { - if(propertyContent === "<root/>\n") { //To clean empty XMLs and don't show them. - propertyContent = ""; - } - return { - "isSingleColumn" : false, - "content" : propertyContent - }; - } - } - - this.searchSorter = function(searchResults) { - - var getChars = function(code) { - var theChars = code.replace(/[0-9]/g, '') - return theChars; - } - - var getNums = function(code) { - var thenum = code.replace( /^\D+/g, ''); - if(thenum.length > 0) { - return parseInt(thenum); - } else { - return 0; - } - } - - var customSort = function(sampleA, sampleB){ - var aCode = getChars(sampleA.code); - var bCode = getChars(sampleB.code); - - var returnValue = null; - if(aCode < bCode) { - returnValue = -1; - } else if(aCode > bCode) { - returnValue = 1; - } else { - var aNum = getNums(sampleA.code); - var bNum = getNums(sampleB.code); - returnValue = aNum - bNum; - } - return -1 * returnValue; - } - - var sortedResults = searchResults.sort(customSort); - - return sortedResults; - } - - this.inspectorContentExtra = function(extraContainerId, sample) { - // When requesting information about the sample, we don't need parents and children, so send a copy of the saple without that information. - var sampleToSend = $.extend({}, sample); - delete sampleToSend.parents; - delete sampleToSend.children; - - var localReference = this; - this.serverFacade.listDataSetsForSample(sampleToSend, true, function(datasets) { - for(var i = 0; i < datasets.result.length; i++) { - var dataset = datasets.result[i]; - if(dataset.dataSetTypeCode === "SEQ_FILE") { - var listFilesForDataSetWithDataset = function(dataset) { - localReference.serverFacade.listFilesForDataSet(dataset.code, "/", true, function(files) { - for(var i = 0; i < files.result.length; i++) { - var isDirectory = files.result[i].isDirectory; - var pathInDataSet = files.result[i].pathInDataSet; - if (/\.svg$/.test(pathInDataSet) && !isDirectory) { - var downloadUrl = localReference.allDataStores[0].downloadUrl + '/' + dataset.code + "/" + pathInDataSet + "?sessionID=" + localReference.serverFacade.getSession(); - d3.xml(downloadUrl, "image/svg+xml", - function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", 400 - 20) - .attr("height", 400 - 20) - .attr("viewBox", "200 200 650 650"); - var inspectorNode = d3.select("#"+extraContainerId).node(); - if(inspectorNode) { //Sometimes the user hides the sticker very clicky and the node doesn't exist anymore - inspectorNode.appendChild(importedNode); - } - }); - } - } - }); - } - listFilesForDataSetWithDataset(dataset); - } - } - } - ); - return ""; - } - } -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LimsProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LimsProfile.js deleted file mode 100644 index 2c9a509e1b224bb0f9619dac0f502fc992057f5e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/LimsProfile.js +++ /dev/null @@ -1,357 +0,0 @@ - -function LimsProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(LimsProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - //this.notShowTypes = ["SYSTEM_EXPERIMENT", "ILLUMINA_FLOW_CELL", "ILLUMINA_FLOW_LANE", "LIBRARY", "LIBRARY_POOL", "MASTER_SAMPLE","MS_INJECTION","RAW_SAMPLE","TEMPLATE_SAMPLE", "SEARCH"]; - this.inventorySpaces = ["YEAST_LAB"]; - this.isShowUnavailablePreviewOnSampleTable = false; - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage 1", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME_1", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW_1", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN_1", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER_1", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY_1" //Should be text. - }, - { - "STORAGE_PROPERTY_GROUP" : "Storage 2", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 2", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME_2", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW_2", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN_2", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER_2", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY_2" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "MINUS80_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOLS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMIDS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITORS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - } - } - - this.typePropertiesForTable = { - "SYSTEM_EXPERIMENT" : ["NAME", "GOALS", "RESULT_INTERPRETATION"], - "GENERAL_PROTOCOL" : ["NAME", "FOR_WHAT", "PROTOCOL_TYPE"], - "PCR" : ["NAME", "FOR_WHAT", "TEMPLATE", "PUBLICATION"], - "WESTERN_BLOTTING" : ["NAME", "FOR_WHAT", "STORAGE"], - "CHEMICAL" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE"], - "ANTIBODY" : ["NAME", "STORAGE", "HOST", "FOR_WHAT"], - "MEDIA" : ["NAME", "STORAGE", "FOR_WHAT", "ORGANISM"], - "SOLUTIONS_BUFFERS" : ["NAME", "STORAGE", "FOR_WHAT"], - "ENZYME" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "KIT"], - "OLIGO" : ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "PROJECT"], - "PLASMID" : ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER"], - "YEAST" : ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "PROJECT", "GENETIC_BACKGROUND", "MATING_TYPE", "FREEZER_NAME", "ROW", "COLUMN", "BOX_NUMBER"], - "BACTERIA" : ["BACTERIA_STRAIN_NAME", "BACTERIA_GENOTYPE", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "COMMENTS"] - } - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "FACS") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } -// if(sampleTypeCode === "SYSTEM_EXPERIMENT") { -// var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; -// var dilutionWidgetController = new DilutionTableController(sample, isEnabled); -// dilutionWidgetController.init($("#" + containerId)); -// } - } - - /* - * Used by Sample Form - */ - this.getSpaceForSampleType = function(type) { - if(type === "BACTERIA") { - return "YEAST_LAB"; - } else if(type === "SOLUTIONS_BUFFERS") { - return "YEAST_LAB"; - } else if(type === "MEDIA") { - return "YEAST_LAB"; - } else if(type === "ENZYME") { - return "YEAST_LAB"; - } else if(type === "CHEMICAL") { - return "YEAST_LAB"; - } else if(type === "ANTIBODY") { - return "YEAST_LAB"; - } else if(type === "OLIGO") { - return "YEAST_LAB"; - } else if(type === "PLASMID") { - return "YEAST_LAB"; - } else if(type === "WESTERN_BLOTTING") { - return "YEAST_LAB"; - } else if(type === "READOUT") { - return "YEAST_LAB"; - } else if(type === "PCR") { - return "YEAST_LAB"; - } else if(type === "GENERAL_PROTOCOL") { - return "YEAST_LAB"; - } else if(type === "YEAST") { - return "YEAST_LAB"; - } else if(type === "POMBE") { - return "YEAST_LAB"; - } else { - return null; - } - } - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "BACTERIA") { - return "/YEAST_LAB/BACTERIA/LAB_BENCH_BACTERIA"; - } else if(type === "SOLUTIONS_BUFFERS") { - return "/YEAST_LAB/CHEMICALS/SOLUTIONS_BUFFERS"; - } else if(type === "MEDIA") { - return "/YEAST_LAB/CHEMICALS/MEDIA"; - } else if(type === "ENZYME") { - return "/YEAST_LAB/CHEMICALS/ENZYMES"; - } else if(type === "CHEMICAL") { - return "/YEAST_LAB/CHEMICALS/CHEMICALS"; - } else if(type === "ANTIBODY") { - return "/YEAST_LAB/CHEMICALS/ANTIBODIES"; - } else if(type === "OLIGO") { - return "/YEAST_LAB/OLIGO/81_BOXES"; - } else if(type === "PLASMID") { - return "/YEAST_LAB/PLASMIDS/LAB_BENCH_PLASMIDS"; - } else if(type === "WESTERN_BLOTTING") { - return "/YEAST_LAB/PROTOCOLS/WESTERN_BLOTTING"; - } else if(type === "READOUT") { - return "/YEAST_LAB/PROTOCOLS/READOUTS"; - } else if(type === "PCR") { - return "/YEAST_LAB/PROTOCOLS/PCR"; - } else if(type === "GENERAL_PROTOCOL") { - return "/YEAST_LAB/PROTOCOLS/GENERAL_PROTOCOLS"; - } else if(type === "YEAST") { - return "/YEAST_LAB/YEAST/LAB_BENCH_YEASTS"; - } else if(type === "POMBE") { - return "/YEAST_LAB/YEAST/LAB_BENCH_POMBE"; - } else { - return null; - } - } - - this.getDataSetTypeForFileName = function(allDatasetFiles, fileName) { - if(fileName.endsWith("gb") || fileName.endsWith("fasta") || fileName.endsWith("xdna") || fileName.endsWith("fa")) { - return "SEQ_FILE"; - } else if(fileName.endsWith("ab1")) { - return "RAW_DATA"; - } else { - return null; - } - } - - this.getHTMLTableFromXML = function(xmlDocument) { - var table_head = null; - var table_body = ""; - var dom; - - if (window.DOMParser) { - parser = new DOMParser(); - dom = parser.parseFromString(xmlDocument,"text/xml"); - } else {// Internet Explorer - dom = new ActiveXObject("Microsoft.XMLDOM"); - dom.async = false; - dom.loadXML(xmlDocument); - } - - var html = null; - var root = dom.childNodes[0]; - var children = root.childNodes; - for(var i = 0; i < children.length; i++) { - var child = children[i]; - if (child.localName != null) { - var keys = child.attributes; - if (table_head == null) { - table_head = "<tr>"; - var key = null; - for (var j = 0; j < keys.length; j++) { - key = keys[j]; - if(key.localName != "permId") { - table_head += "<th style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>"+ key.localName + "</th>"; - } - } - table_head += "</tr>"; - } - table_body += "<tr>"; - for (var j = 0; j < keys.length; j++) { - key = keys[j]; - if(key.localName != "permId") { - if(key.localName == "date") { - table_body += "<td style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>" + key.value + "</td>"; - } else { - table_body += "<td style='text-align:left; width:" + (100/(keys.length-1)) + "%;'>" + key.value + "</td>"; - } - } - } - table_body += "</tr>"; - } - } - html = "<table style='font-family:helvetica; font-size:90%; width: 100%;'><thead>" + table_head + "</thead><tbody>"+ table_body + "</tbody></table>"; - return html; - } - - this.inspectorContentTransformer = function(sample, propertyCode, propertyContent) { - - if(propertyContent.indexOf("<root>") != -1) { - return { - "isSingleColumn" : true, - "content" : this.getHTMLTableFromXML(propertyContent) - }; - } else { - if(propertyContent === "<root/>\n") { //To clean empty XMLs and don't show them. - propertyContent = ""; - } - return { - "isSingleColumn" : false, - "content" : propertyContent - }; - } - } - - this.searchSorter = function(searchResults) { - - var getChars = function(code) { - var theChars = code.replace(/[0-9]/g, '') - return theChars; - } - - var getNums = function(code) { - var thenum = code.replace( /^\D+/g, ''); - if(thenum.length > 0) { - return parseInt(thenum); - } else { - return 0; - } - } - - var customSort = function(sampleA, sampleB){ - var aCode = getChars(sampleA.code); - var bCode = getChars(sampleB.code); - - var returnValue = null; - if(aCode < bCode) { - returnValue = -1; - } else if(aCode > bCode) { - returnValue = 1; - } else { - var aNum = getNums(sampleA.code); - var bNum = getNums(sampleB.code); - returnValue = aNum - bNum; - } - return -1 * returnValue; - } - - var sortedResults = searchResults.sort(customSort); - - return sortedResults; - } - - this.inspectorContentExtra = function(extraContainerId, sample) { - // When requesting information about the sample, we don't need parents and children, so send a copy of the saple without that information. - var sampleToSend = $.extend({}, sample); - delete sampleToSend.parents; - delete sampleToSend.children; - - var localReference = this; - this.serverFacade.listDataSetsForSample(sampleToSend, true, function(datasets) { - for(var i = 0; i < datasets.result.length; i++) { - var dataset = datasets.result[i]; - if(dataset.dataSetTypeCode === "SEQ_FILE") { - var listFilesForDataSetWithDataset = function(dataset) { - localReference.serverFacade.listFilesForDataSet(dataset.code, "/", true, function(files) { - for(var i = 0; i < files.result.length; i++) { - var isDirectory = files.result[i].isDirectory; - var pathInDataSet = files.result[i].pathInDataSet; - if (/\.svg$/.test(pathInDataSet) && !isDirectory) { - var downloadUrl = localReference.allDataStores[0].downloadUrl + '/' + dataset.code + "/" + pathInDataSet + "?sessionID=" + localReference.serverFacade.getSession(); - d3.xml(downloadUrl, "image/svg+xml", - function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", 400 - 20) - .attr("height", 400 - 20) - .attr("viewBox", "200 200 650 650"); - var inspectorNode = d3.select("#"+extraContainerId).node(); - if(inspectorNode) { //Sometimes the user hides the sticker very clicky and the node doesn't exist anymore - inspectorNode.appendChild(importedNode); - } - }); - } - } - }); - } - listFilesForDataSetWithDataset(dataset); - } - } - } - ); - return ""; - } - } -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MateescuLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MateescuLabProfile.js deleted file mode 100644 index 46b97792a56c810a2f86adff540617ec9c0ff702..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MateescuLabProfile.js +++ /dev/null @@ -1,149 +0,0 @@ - -function MateescuLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(MateescuLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - -this.storagesConfiguration = { - "isEnabled" : true, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "N2_TANK_A" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "N2_TANK_B" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 6, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 5, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_MAIN" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 18 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 10 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_CELL_CULTURE" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 10 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_LAB" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_CELL_CULTURE" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "COLD_ROOM" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CABINET_LAB_RT" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "SHELF_LAB_RT" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LAB_BENCH1 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LAB_BENCH2 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LAB_BENCH3 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LAB_BENCH4 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LAB_BENCH5 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CELL_CULTURE_BENCH1 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CELL_CULTURE_BENCH2 : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - - - - } - }; - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MuellerProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MuellerProfile.js deleted file mode 100644 index e06d8effeea4fa08a438379a5ddf20088bec39eb..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/MuellerProfile.js +++ /dev/null @@ -1,384 +0,0 @@ - -function MuellerProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(MuellerProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - - this.hideCodes = true; - - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "DEFAULT_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LN2_TANK" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 10, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_FREEZER" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 20, //Number of rows - "COLUMN_NUM" : 5, //Number of columns - "BOX_NUM" : 4 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "PCR_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast parents", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - "SAMPLE_PARENTS_ANNOTATIONS_COPY" : { "YEAST" : ["PLASMID"] } - }, - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Parental fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "RNA", - "TYPE": "RNA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "PCR protocol", - "TYPE": "PCR_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Western blotting protocol", - "TYPE": "WESTERN_BLOTTING_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "EXPERIMENTAL_STEP") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/NexusProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/NexusProfile.js deleted file mode 100644 index 6ee877c6f535802f96bc53b3a75b9249cf86b1c9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/NexusProfile.js +++ /dev/null @@ -1,138 +0,0 @@ - -function NexusProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(NexusProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.mainMenu = { - showLabNotebook : false, - showInventory : false, - showDrawingBoard : false, - showSampleBrowser : true, - showStorageManager : false, - showAdvancedSearch : false, - showTrashcan : false, - showVocabularyViewer : false, - showUserManager : false - } - - this.propertyReplacingCode = "CELLARIO_BC"; - this.inventorySpaces = ["LIBRARIES"]; - this.searchSamplesUsingV3OnDropbox = true; - this.searchSamplesUsingV3OnDropboxRunCustom = true; - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "PLATE" && sample.spaceCode === "LIBRARIES") { - var clickFunc = function() { - //Data - var $plateCode = FormUtil.getFieldForLabelWithText("Plate Identifier", sample.identifier, "plate_identifier"); - var $dateField = FormUtil._getDatePickerField("expiry_date", "Expiry Date", true); - - var $expiryDate = FormUtil.getFieldForComponentWithLabel($dateField,"Expiry Date(*)"); - - //Cancel/Ok buttons - var $cancelButton = $("<a>", { "class" : "btn btn-default" }).append("<span class='glyphicon glyphicon-remove'></span>"); - $cancelButton.click(function(event) { - Util.unblockUI(); - }); - - var retireAction = function() { - var plate_identifier = sample.identifier; - var expiry_date = $($($dateField.children()[0]).children()[0]).val(); - - if(!expiry_date) { - Util.showError("Expiry date missing.", function() {}, true); - return; - } - - Util.blockUI(); - - require([ 'openbis', - 'as/dto/service/id/CustomASServiceCode', - 'as/dto/service/CustomASServiceExecutionOptions'], function(openbis, CustomASServiceCode, CustomASServiceExecutionOptions) { - - var testProtocol = window.location.protocol; - var testHost = window.location.hostname; - var testPort = window.location.port; - var testUrl = testProtocol + "//" + testHost + ":" + testPort; - var testApiUrl = testUrl + "/openbis/openbis/rmi-application-server-v3.json"; - - var v3Api = new openbis(testApiUrl); - v3Api._private.sessionToken = mainController.serverFacade.getSession(); - - var serviceCode = new CustomASServiceCode("plate_version_service"); - var serviceOptions = new CustomASServiceExecutionOptions(); - serviceOptions.withParameter("plate_identifier", plate_identifier).withParameter("expiry_date", expiry_date).withParameter("action", "new_version"); - - v3Api.executeCustomASService(serviceCode, serviceOptions) - .done(function(result) { - Util.showSuccess("Plate Retired"); - Util.unblockUI(); - }) - .fail(function(result) { - Util.showError("Plate Not Retired"); - Util.unblockUI(); - }); - }); - }; - var $retireButton = FormUtil.getButtonWithText("Retire Plate!", retireAction, "btn-warning"); - - // Mounting the widget with the components - var $retirePlateWidget = $("<div>"); - $retirePlateWidget.append($("<div>", {"style" : "text-align:right;"}).append($cancelButton)); - $retirePlateWidget.append($("<form>", { "class" : "form-horizontal" , "style" : "margin-left:20px; margin-right:20px;"}) - .append($("<h1>").append("Retire Plate")) - .append($plateCode) - .append($expiryDate) - .append($("<br>")).append($retireButton) - ); - - // Show Widget - Util.blockUI($retirePlateWidget, {'text-align' : 'left', 'top' : '10%', 'width' : '80%', 'left' : '10%', 'right' : '10%', 'height' : '300px', 'overflow' : 'auto'}); - - }; - $("#" + containerId) - .append($("<br>")) - .append(FormUtil.getButtonWithText("Retire Plate", clickFunc, "btn-warning")); - } - } - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "MY_FRIDGE-1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MY_FRIDGE-2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - this.sampleTypeDefinitionsExtension = {} -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/OBISELNTestProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/OBISELNTestProfile.js deleted file mode 100644 index 60e3f547727ea02d1f36be493cfd9a1f4c2aa287..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/OBISELNTestProfile.js +++ /dev/null @@ -1,114 +0,0 @@ - -function OBISELNTestProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(OBISELNTestProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.inventorySpaces = ["INVENTORY"]; - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }, - { - "STORAGE_PROPERTY_GROUP" : "Storage 2", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 2", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME_2", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW_2", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN_2", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER_2", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY_2" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "MINUS80_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS820_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOLS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMIDS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITORS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - } - } - - - //The properties you want to appear on the tables, if you don«t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "FACS") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } -// if(sampleTypeCode === "SYSTEM_EXPERIMENT") { -// var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; -// var dilutionWidgetController = new DilutionTableController(sample, isEnabled); -// dilutionWidgetController.init($("#" + containerId)); -// } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PankeLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PankeLabProfile.js deleted file mode 100644 index 9ecd98e9a7a8dd7af17eae315bba09010b812638..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PankeLabProfile.js +++ /dev/null @@ -1,92 +0,0 @@ - -function PankeLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(PankeLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - - - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "STRAIN" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - "SAMPLE_PARENTS_ANNOTATIONS_COPY" : { "STRAIN" : ["PLASMID"] } - }, - - - - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - - - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - { - "LABEL" : "Strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - - - - - - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PeterLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PeterLabProfile.js deleted file mode 100644 index 08107dc49e3235f62c2254549767bc928829c014..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PeterLabProfile.js +++ /dev/null @@ -1,296 +0,0 @@ - -function PeterLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(PeterLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - this.storagesConfiguration = { - "isEnabled" : true, - "STORAGE_PROPERTIES": [], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "G9_FRIDGE-1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G9_FRIDGE-2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G9_FREEZER-A" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G9_FREEZER-B" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G9_FREEZER-C" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-D" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 7, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-E" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 14, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-F" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-G" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-H" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FREEZER-I" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FRIDGE-3" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FRIDGE-4" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FRIDGE-5" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FRIDGE-6" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G10_FRIDGE-7" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G11_FRIDGE-8" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FREEZER-J" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FREEZER-K" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 8, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FREEZER-L" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FREEZER-M" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FRIDGE-9" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G14_FRIDGE-10" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G17_FRIDGE-11" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G17_FRIDGE-12" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "G17_FREEZER-N" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-80" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-20" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-RT" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - var getStoragGroupFromTemplate = function(groupNumber) { - return { - "STORAGE_PROPERTY_GROUP" : "Physical Storage " + groupNumber, //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage " + groupNumber, //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAME_" + groupNumber, //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW_" + groupNumber, //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN_" + groupNumber, //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME_" + groupNumber, //Should be text. - "USER_PROPERTY" : "STORAGE_USER_" + groupNumber, //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE_" + groupNumber, //Should be Vocabulary. - "POSITION_PROPERTY" : "STORAGE_BOX_POSITION_" + groupNumber //Should be text. - }; - } - - var numberOfStorageGroups = 65; - for(var sIdx = 1; sIdx <= numberOfStorageGroups; sIdx++) { - this.storagesConfiguration["STORAGE_PROPERTIES"].push(getStoragGroupFromTemplate(sIdx)); - } - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOLS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMIDS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITORS", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - }, - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell", - "TYPE": "CELL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "siRNA", - "TYPE": "SIRNA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast collection", - "TYPE": "YEAST_COLLECTION", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Protein complex", - "TYPE": "PROTEIN_COMPLEX", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Experimental step", - "TYPE": "EXPERIMENTAL_STEP", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - ], - } - - } -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PhosphoProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PhosphoProfile.js deleted file mode 100644 index 285d03904d6e356cbdfef3dcce1ed06f2595724b..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PhosphoProfile.js +++ /dev/null @@ -1,34 +0,0 @@ -function PhosphoProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(PhosphoProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - //Put on this list all experiment types, ELN experiments need to have both an experiment type and a sample type with the same CODE. - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - - //Black list, put on this list all types that you don�t want to appear on the menu and the ELN experiments. - this.notShowTypes = ["SYSTEM_EXPERIMENT", "FJELMER_TEST", "SEARCH"]; - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = { - "BIOLOGICAL_SAMPLE" : ["NAME", "COMMENT", "TREATMENT_TYPE1", "TREATMENT_VALUE1", "TREATMENT_TYPE2", "TREATMENT_VALUE2", "TREATMENT_TYPE3", "TREATMENT_VALUE3"], - "BIOL_APMS" : ["NAME", "COMMENT", "BAIT", "DIGESTION"], - "BIOL_BASIC" : ["NAME", "COMMENT", "BIOLOGICAL_SAMPLE_TYPE", "TAX_ID", "SAMPLE_PREPARATION", "FRACTIONATION", "DIGESTION", "LABELING"], - "BIOL_CLINICAL" : ["NAME", "COMMENT", "DIGESTION", "LABELING"], - "BIOL_DDB" : ["NAME", "EM_PATIENTS", "CK_PATIENTS", "GENOME", "STRAIN_NAME", "PRIMARY_CELL_TYPE"], - "BIOL_MICROORGANISMS" : ["NAME", "BIOLOGICAL_SAMPLE_TYPE", "TAX_ID", "STRAIN", "SAMPLE_PREPARATION"], - "BIOL_PHOSPHO" : ["NAME", "SAMPLE_PREPARATION", "TREATMENT_PH_1", "TREATMENT_MO_1_VALUE", "TREATMENT_MO_1_TIME"], - "BIOL_SYNTHETIC" : ["NAME", "TYPE_SYNTHETIC", "SYNTHETIC_PEPTIDE"], - "BIOL_XL" : ["NAME", "COMMENT","CROSS_LINKER"], - "MS_INJECTION" : ["INSTRUMENT_TYPE"] - }; - - //The configuration for the visual storages. - this.storagesConfiguration = { - "isEnabled" : false - }; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PicottiLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PicottiLabProfile.js deleted file mode 100644 index 6c4e8b272db98ba25414a3bd8c23958836744801..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/PicottiLabProfile.js +++ /dev/null @@ -1,138 +0,0 @@ - -function PicottiLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(PicottiLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - this.storagesConfiguration = { - "isEnabled" : true, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.BOX_POSITION, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_TOPLOADER" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.BOX_POSITION, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 8, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS80_UPRIGHT" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 16, //Number of rows - "COLUMN_NUM" : 12, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_1" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_2" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_3" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_4" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_5" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_SMALL_6" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "MINUS20_BIG_1" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 14, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_1" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_2" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_3" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_4" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_5" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CHEMICAL_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FUMEHOOD" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 999999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SanchezLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SanchezLabProfile.js deleted file mode 100644 index d84c7e02d27f876f5964fa322aeb7fae9400440f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SanchezLabProfile.js +++ /dev/null @@ -1,60 +0,0 @@ - -function SanchezLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(SanchezLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - this.storagesConfiguration = { - "isEnabled" : true, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.BOX_POSITION, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "DEFAULT_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.BOX_POSITION, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "TRAY60" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 3, //Number of rows - "COLUMN_NUM" : 5, //Number of columns - "BOX_NUM" : 4 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "TRAY28" : { //Freezer name given by the NAME_PROPERTY - "VALIDATION_LEVEL" : ValidationLevel.RACK, //When non present it defaults to BOX_POSITION - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 7, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SchwankLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SchwankLabProfile.js deleted file mode 100644 index f3b9d4d09a7ad74d32d10a74315c2fa103a6f149..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/SchwankLabProfile.js +++ /dev/null @@ -1,485 +0,0 @@ - -function SchwankLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(SchwankLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "FRIDGE_MAIN_SMALL_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_MAIN_SMALL_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_MAIN_SMALL_3" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_MAIN_SMALL_4" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_MAIN_SMALL_5" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_3" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_4" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_5" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_SMALL_6" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 4, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MAIN_LARGE_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 7, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_CELL_LAB_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 7, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 20 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FRIDGE_CELL_LAB_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MINUS80_UPSTAIRS_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 16 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "FREEZER_MINUS80_D-FLOOR_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 16 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "LIQUID_NITROGEN_1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 10, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CHEMICAL_CABINET" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 6, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 10 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "CUPBOARD" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - - } - }; - - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "PCR_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - ], - }, - - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast parents", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ] - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - "CELLCULTURE_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - "HISTOCHEMISTRY_PROTOCOLS" : { - "SAMPLE_PARENTS_HINT" : [ - - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "PCR protocol", - "TYPE": "PCR_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Western blotting protocol", - "TYPE": "WESTERN_BLOTTING_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell culture protocol", - "TYPE": "CELLCULTURE_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Histochemistry protocol", - "TYPE": "HISTOCHEMISTRY_PROTOCOLS", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - - } -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/StoffelLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/StoffelLabProfile.js deleted file mode 100644 index c05fcc4ff42dbf18b7e36edc86196eecceed100f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/StoffelLabProfile.js +++ /dev/null @@ -1,129 +0,0 @@ - -function StoffelLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(StoffelLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - - //Use this with all known types to create groups, if a type is not specified by default will be added to the OTHERS group. - this.inventorySpaces = ["INVENTORY"]; - this.isShowUnavailablePreviewOnSampleTable = true; - - this.getSpaceForSampleType = function(type) { - if(type === "ANTIBODY") { - return "INVENTORY"; - } else if(type === "PLASMID") { - return "INVENTORY"; - } else if(type === "INHIBITOR") { - return "INVENTORY"; - } else if(type === "CELL_LINE") { - return "INVENTORY"; - } else { - return null; - } - } - - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "ANTIBODY") { - return "/INVENTORY/SAMPLES/ANTIBODIES"; - } else if(type === "PLASMID") { - return "/INVENTORY/SAMPLES/PLASMIDS"; - } else if(type === "INHIBITOR") { - return "/INVENTORY/SAMPLES/INHIBITORS"; - } else if(type === "CELL_LINE") { - return "/INVENTORY/SAMPLES/CELL_LINES"; - } else { - return null; - } - } - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "H20.1_STOFFEL-1" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "H20.1_STOFFEL-2" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 5, //Number of rows - "COLUMN_NUM" : 4, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-80" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-20" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH-RT" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "PLASMID_EXPRESSION" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Protocol", - "TYPE": "PROTOCOL", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Inhibitor", - "TYPE": "INHIBITOR", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - , - { - "LABEL" : "Cell Line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 1, - "ANNOTATION_PROPERTIES" : [] - } - ], - } - } - - - //The properties you want to appear on the tables, if you don�t specify the list, all of them will appear by default. - this.typePropertiesForTable = {}; -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/TestProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/TestProfile.js deleted file mode 100644 index 1411edce9911e85871145e461c12415b716ce9cf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/TestProfile.js +++ /dev/null @@ -1,149 +0,0 @@ -function TestProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(TestProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.ELNExperiments = ["SYSTEM_EXPERIMENT"]; - this.notShowTypes = ["ANTIBODY_PANEL"]; - this.isShowUnavailablePreviewOnSampleTable = false; - this.inventorySpaces = ["BODENMILLER_LAB", "INVENTORY"]; - - //For testing -// this.sampleTypeDefinitionsExtension = { -// "SYSTEM_EXPERIMENT" : { -// "SAMPLE_PARENTS_HINT" : [ -// { -// "LABEL" : "Protein", -// "TYPE": "PROTEIN", -// "MIN_COUNT" : 1, -// "ANNOTATION_PROPERTIES" : [ {"TYPE" : "PHOSPHO", "MANDATORY" : true } -// ,{"TYPE" : "ISOTYPE", "MANDATORY" : false }] -// } -// ], -// "SAMPLE_CHILDREN_HINT" : [ -// { -// "LABEL" : "Protein", -// "TYPE": "PROTEIN", -// "MIN_COUNT" : 1, -// "ANNOTATION_PROPERTIES" : [ {"TYPE" : "PHOSPHO", "MANDATORY" : true } -// ,{"TYPE" : "ISOTYPE", "MANDATORY" : false }] -// } -// ] -// } -// } -// -// this.typePropertiesForSmallTable = { -// "SYSTEM_EXPERIMENT" : ["NAME"], -// "PROTEIN" : ["PROTEIN_NAME"] -// } - - //this.typePropertiesForTable = { - // "SYSTEM_EXPERIMENT" : ["NAME", "GOALS", "RESULT_INTERPRETATION"], - //} - - this.storagesConfiguration = { - "isEnabled" : true, - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Storage information", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 1", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY" //Should be text. - }, - { - "STORAGE_PROPERTY_GROUP" : "Storage information 2", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Storage Group 2", //Storage Group Name - "NAME_PROPERTY" : "FREEZER_NAME_2", //Should be a Vocabulary. - "ROW_PROPERTY" : "ROW_2", //Should be an integer. - "COLUMN_PROPERTY" : "COLUMN_2", //Should be an integer. - "BOX_PROPERTY" : "BOX_NUMBER_2", //Should be text. - "USER_PROPERTY" : "USER_PROPERTY_2" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "TESTFREEZER" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 9, //Number of rows - "COLUMN_NUM" : 9, //Number of columns - "BOX_NUM" : 3 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "USER_BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 99999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* - * Used by Sample Form - */ - this.getSpaceForSampleType = function(type) { - if(type === "PROTEIN") { - return "BODENMILLER_LAB"; - } else if(type === "CLONE") { - return "BODENMILLER_LAB"; - } else if(type === "CONJUGATED_CLONE") { - return "BODENMILLER_LAB"; - } else if(type === "LOT") { - return "BODENMILLER_LAB"; - } else if(type === "CHEMICALS") { - return "BODENMILLER_LAB"; - } else if(type === "CELL_LINES") { - return "BODENMILLER_LAB"; - } else { - return null; - } - } - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "PROTEIN") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CLONE") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CONJUGATED_CLONE") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "LOT") { - return "/BODENMILLER_LAB/ANTIBODIES/ANTIBODIES"; - } else if(type === "CHEMICALS") { - return "/BODENMILLER_LAB/CHEMICALS/CHEMICALS"; - } else if(type === "CELL_LINES") { - return "/BODENMILLER_LAB/CELL_LINES/CELL_LINES"; - } else { - return null; - } - } - - /* - * Used by Main Menu - */ - this.mainMenuContentExtra = function() { - return "<center><h5><i class='icon-info-sign'></i> Please log in into your google account on the brower to see your laboratory calendar.</h5></center><br /><iframe src='https://www.google.com/calendar/embed?src=kcm620topcrg5677ikbn5epg0s%40group.calendar.google.com&ctz=Europe/Zurich' margin-left = '20' style='border: 50' width='800' height='600' frameborder='0' scrolling='no'></iframe>"; - } - - /* - * Used by Sample Form - */ - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "SYSTEM_EXPERIMENT") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } -// if(sampleTypeCode === "SYSTEM_EXPERIMENT") { -// var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; -// var dilutionWidgetController = new DilutionTableController(sample, isEnabled); -// dilutionWidgetController.init($("#" + containerId)); -// } - } - } -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/VoinnetLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/VoinnetLabProfile.js deleted file mode 100644 index 3fc93657b7ea9e2794d5ff5f2a52ec3faa5d8dbd..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/VoinnetLabProfile.js +++ /dev/null @@ -1,12 +0,0 @@ - -function VoinnetLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(VoinnetLabProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - -} -}); diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisLabProfile.js deleted file mode 100644 index 00c9939138de85e8098e076f5c5008b75c834c97..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisLabProfile.js +++ /dev/null @@ -1,180 +0,0 @@ - -function WeisLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(WeisLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - - this.hideCodes = true; - - - this.storagesConfiguration = { - "isEnabled" : true, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "DEFAULT_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - - - - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Restriction enzyme", - "TYPE": "RESTRICTION_ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "STRAIN" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - "SAMPLE_PARENTS_ANNOTATIONS_COPY" : { "STRAIN" : ["PLASMID"] } - }, - - - - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Restriction enzyme", - "TYPE": "RESTRICTION_ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - { - "LABEL" : "Yeast strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "EXPERIMENTAL_STEP") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisProfile.js deleted file mode 100644 index 033e302e4af9c21baec07153b89cd53c19611024..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/WeisProfile.js +++ /dev/null @@ -1,174 +0,0 @@ - -function WeisProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(WeisProfile.prototype, StandardProfile.prototype, { - init: function(serverFacade){ - StandardProfile.prototype.init.call(this, serverFacade); - - - this.hideCodes = true; - - - this.storagesConfiguration = { - "isEnabled" : false, - "storageSpaceLowWarning" : 0.8, //Storage goes over 80% - "boxSpaceLowWarning" : 0.8, //Box goes over 80% - /* - * Should be the same across all storages, if not correct behaviour is not guaranteed. - */ - "STORAGE_PROPERTIES": [{ - "STORAGE_PROPERTY_GROUP" : "Physical Storage", //Where the storage will be painted. - "STORAGE_GROUP_DISPLAY_NAME" : "Physical Storage", //Storage Group Name - "NAME_PROPERTY" : "STORAGE_NAMES", //Should be a Vocabulary. - "ROW_PROPERTY" : "STORAGE_ROW", //Should be an integer. - "COLUMN_PROPERTY" : "STORAGE_COLUMN", //Should be an integer. - "BOX_PROPERTY" : "STORAGE_BOX_NAME", //Should be text. - "BOX_SIZE_PROPERTY" : "STORAGE_BOX_SIZE", //Should be Vocabulary. - "USER_PROPERTY" : "STORAGE_USER", //Should be text. - "POSITION_PROPERTY" : "STORAGE_POSITION" //Should be text. - }], - /* - * Storages map, can hold configurations for several storages. - */ - "STORAGE_CONFIGS": { - "BENCH" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 1 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - }, - "DEFAULT_STORAGE" : { //Freezer name given by the NAME_PROPERTY - "ROW_NUM" : 1, //Number of rows - "COLUMN_NUM" : 1, //Number of columns - "BOX_NUM" : 9999 //Boxes on each rack, used for validation, to avoid validation increase the number to 9999 for example - } - } - }; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - - - - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Restriction enzyme", - "TYPE": "RESTRICTION_ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - - "PLASMID" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - }, - - "STRAIN" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Yeast strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - "SAMPLE_PARENTS_ANNOTATIONS_COPY" : { "STRAIN" : ["PLASMID"] } - }, - - - - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [ {"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Restriction enzyme", - "TYPE": "RESTRICTION_ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - - { - "LABEL" : "Yeast strain", - "TYPE": "STRAIN", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - ], - } - - } - - -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile.js deleted file mode 100644 index ae23519a69a1f149f7ad6beade4d0605b04d9ade..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile.js +++ /dev/null @@ -1,294 +0,0 @@ -function YeastLabProfile(serverFacade) { - this.init(serverFacade); -} - -$.extend(YeastLabProfile.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.notShowTypes = ["SYSTEM_EXPERIMENT", "ILLUMINA_FLOW_CELL", "ILLUMINA_FLOW_LANE", "LIBRARY", "LIBRARY_POOL", "MASTER_SAMPLE","MS_INJECTION","RAW_SAMPLE","TEMPLATE_SAMPLE", "SEARCH"]; - this.inventorySpaces = ["YEAST_LAB"]; - this.isShowUnavailablePreviewOnSampleTable = false; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "RESULT" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - , - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - , - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - , - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - , - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - , - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - , - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - , - { - "LABEL" : "Pombe", - "TYPE": "POMBE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - - , - { - "LABEL" : "Solution buffers", - "TYPE": "SOLUTIONS_BUFFERS", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - , - { - "LABEL" : "Transcription factor", - "TYPE": "TRANSCRIPTION_FACTOR", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - , - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS", "MANDATORY" : false }] - } - - - ] - } - } - - - this.typePropertiesForTable = { - "SYSTEM_EXPERIMENT" : ["NAME", "GOALS", "RESULT_INTERPRETATION"], - "GENERAL_PROTOCOL" : ["NAME", "FOR_WHAT", "PROTOCOL_TYPE"], - "PCR" : ["NAME", "FOR_WHAT", "TEMPLATE", "PUBLICATION"], - "WESTERN_BLOTTING" : ["NAME", "FOR_WHAT", "STORAGE"], - "CHEMICAL" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE"], - "ANTIBODY" : ["NAME", "STORAGE", "HOST", "FOR_WHAT"], - "MEDIA" : ["NAME", "STORAGE", "FOR_WHAT", "ORGANISM"], - "SOLUTIONS_BUFFERS" : ["NAME", "STORAGE", "FOR_WHAT"], - "ENZYME" : ["NAME", "SUPPLIER", "ARTICLE_NUMBER", "KIT"], - "OLIGO" : ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "PROJECT"], - "PLASMID" : ["OWNER", "OWNER_NUMBER", "PLASMID_NAME", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER"], - "YEAST" : ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "PROJECT", "GENETIC_BACKGROUND", "MATING_TYPE", "FREEZER_NAME", "ROW", "COLUMN", "BOX_NUMBER"], - "BACTERIA" : ["BACTERIA_STRAIN_NAME", "BACTERIA_GENOTYPE", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "COMMENTS"] - } - - /* - * Used by Sample Form - */ - this.getSpaceForSampleType = function(type) { - if(type === "BACTERIA") { - return "YEAST_LAB"; - } else if(type === "SOLUTIONS_BUFFERS") { - return "YEAST_LAB"; - } else if(type === "MEDIA") { - return "YEAST_LAB"; - } else if(type === "ENZYME") { - return "YEAST_LAB"; - } else if(type === "CHEMICAL") { - return "YEAST_LAB"; - } else if(type === "ANTIBODY") { - return "YEAST_LAB"; - } else if(type === "OLIGO") { - return "YEAST_LAB"; - } else if(type === "PLASMID") { - return "YEAST_LAB"; - } else if(type === "WESTERN_BLOTTING") { - return "YEAST_LAB"; - } else if(type === "READOUT") { - return "YEAST_LAB"; - } else if(type === "PCR") { - return "YEAST_LAB"; - } else if(type === "GENERAL_PROTOCOL") { - return "YEAST_LAB"; - } else if(type === "YEAST") { - return "YEAST_LAB"; - } else if(type === "POMBE") { - return "YEAST_LAB"; - } else { - return null; - } - } - - this.getExperimentIdentifierForSample = function(type, code, properties) { - if(type === "BACTERIA") { - return "/YEAST_LAB/BACTERIA/LAB_BENCH_BACTERIA"; - } else if(type === "SOLUTIONS_BUFFERS") { - return "/YEAST_LAB/CHEMICALS/SOLUTIONS_BUFFERS"; - } else if(type === "MEDIA") { - return "/YEAST_LAB/CHEMICALS/MEDIA"; - } else if(type === "ENZYME") { - return "/YEAST_LAB/CHEMICALS/ENZYMES"; - } else if(type === "CHEMICAL") { - return "/YEAST_LAB/CHEMICALS/CHEMICALS"; - } else if(type === "ANTIBODY") { - return "/YEAST_LAB/CHEMICALS/ANTIBODIES"; - } else if(type === "OLIGO") { - return "/YEAST_LAB/OLIGO/81_BOXES"; - } else if(type === "PLASMID") { - return "/YEAST_LAB/PLASMIDS/LAB_BENCH_PLASMIDS"; - } else if(type === "WESTERN_BLOTTING") { - return "/YEAST_LAB/PROTOCOLS/WESTERN_BLOTTING"; - } else if(type === "READOUT") { - return "/YEAST_LAB/PROTOCOLS/READOUTS"; - } else if(type === "PCR") { - return "/YEAST_LAB/PROTOCOLS/PCR"; - } else if(type === "GENERAL_PROTOCOL") { - return "/YEAST_LAB/PROTOCOLS/GENERAL_PROTOCOLS"; - } else if(type === "YEAST") { - return "/YEAST_LAB/YEAST/LAB_BENCH_YEASTS"; - } else if(type === "POMBE") { - return "/YEAST_LAB/YEAST/LAB_BENCH_POMBE"; - } else { - return null; - } - } - - this.getDataSetTypeForFileName = function(allDatasetFiles, fileName) { - if(fileName.endsWith("gb") || fileName.endsWith("fasta") || fileName.endsWith("xdna") || fileName.endsWith("fa")) { - return "SEQ_FILE"; - } else if(fileName.endsWith("ab1")) { - return "RAW_DATA"; - } else { - return null; - } - } - - this.searchSorter = function(searchResults) { - - var getChars = function(code) { - var theChars = code.replace(/[0-9]/g, '') - return theChars; - } - - var getNums = function(code) { - var thenum = code.replace( /^\D+/g, ''); - if(thenum.length > 0) { - return parseInt(thenum); - } else { - return 0; - } - } - - var customSort = function(sampleA, sampleB){ - var aCode = getChars(sampleA.code); - var bCode = getChars(sampleB.code); - - var returnValue = null; - if(aCode < bCode) { - returnValue = -1; - } else if(aCode > bCode) { - returnValue = 1; - } else { - var aNum = getNums(sampleA.code); - var bNum = getNums(sampleB.code); - returnValue = aNum - bNum; - } - return -1 * returnValue; - } - - var sortedResults = searchResults.sort(customSort); - - return sortedResults; - } - - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "RESULT") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } - } - - - this.inspectorContentExtra = function(extraContainerId, sample) { - // When requesting information about the sample, we don't need parents and children, so send a copy of the saple without that information. - var sampleToSend = $.extend({}, sample); - delete sampleToSend.parents; - delete sampleToSend.children; - - var localReference = this; - this.serverFacade.listDataSetsForSample(sampleToSend, true, function(datasets) { - for(var i = 0; i < datasets.result.length; i++) { - var dataset = datasets.result[i]; - if(dataset.dataSetTypeCode === "SEQ_FILE") { - var listFilesForDataSetWithDataset = function(dataset) { - localReference.serverFacade.listFilesForDataSet(dataset.code, "/", true, function(files) { - for(var i = 0; i < files.result.length; i++) { - var isDirectory = files.result[i].isDirectory; - var pathInDataSet = files.result[i].pathInDataSet; - if (/\.svg$/.test(pathInDataSet) && !isDirectory) { - var downloadUrl = localReference.allDataStores[0].downloadUrl + '/' + dataset.code + "/" + pathInDataSet + "?sessionID=" + localReference.serverFacade.getSession(); - d3.xml(downloadUrl, "image/svg+xml", - function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", 400 - 20) - .attr("height", 400 - 20) - .attr("viewBox", "200 200 650 650"); - var inspectorNode = d3.select("#"+extraContainerId).node(); - if(inspectorNode) { //Sometimes the user hides the sticker very clicky and the node doesn't exist anymore - inspectorNode.appendChild(importedNode); - } - }); - } - } - }); - } - listFilesForDataSetWithDataset(dataset); - } - } - } - ); - return ""; - } - } -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile2.js b/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile2.js deleted file mode 100644 index 97931cb2670f7c4ba44db02b14a883a4a63a64bc..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/installations/YeastLabProfile2.js +++ /dev/null @@ -1,361 +0,0 @@ - -function YeastLabProfile2(serverFacade) { - this.init(serverFacade); -} - -$.extend(YeastLabProfile2.prototype, DefaultProfile.prototype, { - init: function(serverFacade){ - DefaultProfile.prototype.init.call(this, serverFacade); - - this.notShowTypes = ["SYSTEM_EXPERIMENT", "ILLUMINA_FLOW_CELL", "ILLUMINA_FLOW_LANE", "LIBRARY", "LIBRARY_POOL", "MASTER_SAMPLE","MS_INJECTION","RAW_SAMPLE","TEMPLATE_SAMPLE", "SEARCH"]; - this.inventorySpaces = ["MATERIALS", "METHODS","YEAST_LAB"]; - this.isShowUnavailablePreviewOnSampleTable = false; - - /* New Sample definition tests*/ - this.sampleTypeDefinitionsExtension = { - "MEDIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - } - ], - }, - - "SOLUTION_BUFFER" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - } - ], - }, - - "GENERAL_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "CONCENTRATION", "MANDATORY" : false }] - } - ], - }, - - "PCR" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "CONCENTRATION" : false }] - }, - ], - }, - - "WESTERN_BLOTTING_PROTOCOL" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - ], - }, - - "RESULT" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "DETAIL", "MANDATORY" : false }] - } - ], - }, - - "READOUT" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }] - } - ], - }, - - "BACTERIA" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Bacteria parents", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - } - ], - }, - - "YEAST" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - } - ], - "SAMPLE_LINKS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false },{"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - }, - - "CELL_LINE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Parental cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Parental fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - } - ], - }, - - "POMBE" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }, {"TYPE" : "CONTAINED", "MANDATORY" : false }] - } - ], - }, - - "FLY" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Fly parents", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - } - ], - }, - - "EXPERIMENTAL_STEP" : { - "SAMPLE_PARENTS_HINT" : [ - { - "LABEL" : "Antibody", - "TYPE": "ANTIBODY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false }, {"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Bacteria", - "TYPE": "BACTERIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Cell line", - "TYPE": "CELL_LINE", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Chemical", - "TYPE": "CHEMICAL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Enzyme", - "TYPE": "ENZYME", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Fly", - "TYPE": "FLY", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Media", - "TYPE": "MEDIA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Oligo", - "TYPE": "OLIGO", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Plasmid", - "TYPE": "PLASMID", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "RNA", - "TYPE": "RNA", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Solution/Buffer", - "TYPE": "SOLUTION_BUFFER", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "QUANTITY", "MANDATORY" : false },{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Yeast", - "TYPE": "YEAST", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "General protocol", - "TYPE": "GENERAL_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "PCR protocol", - "TYPE": "PCR_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - }, - { - "LABEL" : "Western blotting protocol", - "TYPE": "WESTERN_BLOTTING_PROTOCOL", - "MIN_COUNT" : 0, - "ANNOTATION_PROPERTIES" : [{"TYPE" : "COMMENTS_MONOLINE", "MANDATORY" : false }] - } - ], - } - - } - - this.sampleFormContentExtra = function(sampleTypeCode, sample, containerId) { - if(sampleTypeCode === "EXPERIMENTAL_STEP") { - var isEnabled = mainController.currentView._sampleFormModel.mode !== FormMode.VIEW; - var freeFormTableController = new FreeFormTableController(sample, isEnabled); - freeFormTableController.init($("#" + containerId)); - } - } - - this.getDataSetTypeForFileName = function(allDatasetFiles, fileName) { - if(fileName.endsWith("gb") || fileName.endsWith("fasta") || fileName.endsWith("xdna") || fileName.endsWith("fa")) { - return "SEQ_FILE"; - } else if(fileName.endsWith("ab1")) { - return "RAW_DATA"; - } else { - return null; - } - } -} -}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.html b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.html deleted file mode 100644 index 5fa2b9e33b3a30bb36c50bf924bee13bb0e968ab..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.html +++ /dev/null @@ -1,73 +0,0 @@ -<div class="repeater" data-staticheight="500px"> - <div class="repeater-header"> - <div class="repeater-header-left"> - <span class="repeater-title"></span> - <div class="repeater-search"> - <div class="search input-group"> - <input type="search" class="form-control" placeholder="Search" /> <span class="input-group-btn"> - <button class="btn btn-default" type="button"> - <span class="glyphicon glyphicon-search"></span> <span class="sr-only">Search</span> - </button> - </span> - </div> - </div> - </div> - <div class="repeater-header-right"> - <div class="dropdown columnDropdown"> - <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown"> - Columns <span class="caret"></span> - </button> - <ul style="padding-left: 10px" class="dropdown-menu" role="menu"></ul> - </div> - </div> - </div> - <div class="repeater-viewport"> - <div class="repeater-canvas"></div> - <div class="loader repeater-loader"></div> - </div> - <div class="repeater-footer"> - <div class="repeater-footer-left"> - <div class="repeater-itemization"> - <span><span class="repeater-start"></span> - <span class="repeater-end"></span> of <span class="repeater-count"></span> items</span> - <div class="btn-group selectlist" data-resize="auto"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <span class="selected-label"> </span> <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu" role="menu"> - <li data-value="5"><a href="#">5</a></li> - <li data-value="10" data-selected="true"><a href="#">10</a></li> - <li data-value="20"><a href="#">20</a></li> - <li data-value="50" data-foo="bar" data-fizz="buzz"><a href="#">50</a></li> - <li data-value="100"><a href="#">100</a></li> - </ul> - <input class="hidden hidden-field" name="itemsPerPage" readonly="readonly" aria-hidden="true" type="text" /> - </div> - <span>Per Page</span> - </div> - </div> - <div class="repeater-footer-right"> - <div class="repeater-pagination"> - <button type="button" class="btn btn-default btn-sm repeater-prev"> - <span class="glyphicon glyphicon-chevron-left"></span> <span class="sr-only">Previous Page</span> - </button> - <label id="MyPageLabel" class="page-label">Page</label> - <div class="repeater-primaryPaging active"> - <div class="input-group input-append dropdown combobox"> - <input type="text" class="form-control" aria-labelledby="MyPageLabel"> - <div class="input-group-btn"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu dropdown-menu-right"></ul> - </div> - </div> - </div> - <input type="text" class="form-control repeater-secondaryPaging" aria-labelledby="MyPageLabel"> <span>of <span - class="repeater-pages"></span></span> - <button type="button" class="btn btn-default btn-sm repeater-next"> - <span class="glyphicon glyphicon-chevron-right"></span> <span class="sr-only">Next Page</span> - </button> - </div> - </div> - </div> -</div> diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.js deleted file mode 100644 index 608a64cbefd90e0f90f15a1c4cd1d0b8f3af8a56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/Grid.js +++ /dev/null @@ -1,219 +0,0 @@ -function Grid(columns, getDataList) { - this.init(columns, getDataList); -} - -$.extend(Grid.prototype, { - init : function(columns, getDataList) { - this.columns = columns; - this.getDataList = getDataList; - }, - - render : function() { - var thisGrid = this; - - thisGrid.panel = $("<div>").addClass("fuelux"); - - $.get("Grid.html", function(template) { - thisGrid.panel.html(template); - thisGrid.renderColumnDropdown(); - thisGrid.panel.repeater({ - defaultView : "list", - dataSource : function(options, callback) { - if (options.view == "list") { - thisGrid.list(options, callback); - } - }, - list_selectable : false, - list_noItemsHTML : 'No items found', - list_rowRendered : function(helpers, callback) { - $(helpers.item).click(function() { - var rowIndex = helpers.item[0].rowIndex; - thisGrid.notifyRowClickListeners({ - "index" : rowIndex, - "data" : thisGrid.result.datas[rowIndex], - "item" : thisGrid.result.items[rowIndex] - }); - }); - - callback(); - } - }); - }); - - return thisGrid.panel; - }, - - renderColumnDropdown : function() { - var thisGrid = this; - - var columnList = thisGrid.panel.find(".columnDropdown").find("ul"); - columnList.click(function(e) { - e.stopPropagation(); - }); - - thisGrid.columns.forEach(function(column, columnIndex) { - var checkbox = $("<input>").attr("type", "checkbox").attr("value", column.property).attr("checked", "checked"); - checkbox.change(function() { - thisGrid.panel.repeater('render'); - }); - var label = $("<label>").attr("role", "menuitem").addClass("checkbox").text(column.label).append(checkbox); - var item = $("<li>").attr("role", "presentation").append(label); - columnList.append(item); - }); - }, - - getAllColumns : function() { - return this.columns; - }, - - getVisibleColumns : function() { - var thisGrid = this; - var columns = []; - - thisGrid.panel.find(".columnDropdown").find("input:checked").each(function(index, element) { - thisGrid.getAllColumns().forEach(function(column) { - var checkbox = $(element); - if (column.property == checkbox.val()) { - columns.push(column); - } - }); - }); - - // add a dummy empty column (repeater does not properly handle visibility of the last column) - columns.push({ - label : null, - property : null, - sortable : false - }); - - return columns; - }, - - filterData : function(dataList, filter) { - var thisGrid = this; - - if (filter) { - filter = filter.toLowerCase(); - dataList = dataList.filter(function(data) { - return thisGrid.columns.some(function(column) { - if (column.filter) { - return column.filter(data, filter); - } else { - var value = "" + data[column.property]; - return value != null && value.toLowerCase().indexOf(filter) != -1; - } - }); - }); - } - - return dataList; - }, - - sortData : function(dataList, sortProperty, sortDirection) { - var thisGrid = this; - - if (sortProperty && sortDirection) { - var sortColumn = null; - thisGrid.columns.forEach(function(column) { - if (column.property == sortProperty) { - sortColumn = column; - } - }); - if (sortColumn) { - var sortFunction = null; - var sortDirection = sortDirection == "asc" ? 1 : -1; - - if (sortColumn.sort) { - sortFunction = sortColumn.sort; - } else { - sortFunction = function(data1, data2) { - var value1 = data1[sortColumn.property]; - var value2 = data2[sortColumn.property]; - return naturalSort(value1, value2); - }; - } - - dataList.sort(function(data1, data2) { - return sortDirection * sortFunction(data1, data2); - }); - } - } - - return dataList; - }, - - renderData : function(dataList) { - var thisGrid = this; - var items = []; - - dataList.forEach(function(data) { - var item = {}; - thisGrid.getVisibleColumns().forEach(function(column) { - var value = null; - if (column.render) { - value = column.render(data); - } else { - value = data[column.property]; - } - item[column.property] = value; - }); - items.push(item); - }); - - return items; - }, - - list : function(options, callback) { - var thisGrid = this; - - thisGrid.getDataList(function(dataList) { - - dataList = thisGrid.filterData(dataList, options.search); - dataList = thisGrid.sortData(dataList, options.sortProperty, options.sortDirection); - - var result = {}; - var defaultPageSize = 50; - var startIndex = options.pageIndex * (options.pageSize || defaultPageSize); - var endIndex = startIndex + (options.pageSize || defaultPageSize); - endIndex = (endIndex <= result.count) ? endIndex : dataList.length; - - result.count = dataList.length; - result.datas = []; - result.items = []; - result.columns = thisGrid.getVisibleColumns(); - result.page = options.pageIndex; - result.pages = Math.ceil(result.count / (options.pageSize || defaultPageSize)); - result.start = startIndex + 1; - result.end = endIndex; - - dataList = dataList.slice(startIndex, endIndex); - itemList = thisGrid.renderData(dataList); - itemList.forEach(function(item, index) { - result.datas.push(dataList[index]); - result.items.push(item); - }); - - // add some delay (repeater does not properly layout columns without it) - setTimeout(function() { - thisGrid.result = result; - callback(result); - }, 1); - }); - }, - - addRowClickListener : function(listener) { - if (!this.rowClickListeners) { - this.rowClickListeners = []; - } - this.rowClickListeners.push(listener); - }, - - notifyRowClickListeners : function(event) { - if (this.rowClickListeners) { - this.rowClickListeners.forEach(function(listener) { - listener(event); - }); - } - } - -}); diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/index.html b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/index.html deleted file mode 100644 index 1d5fb1e7dcae8989376d6494d5715fd089a8217a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/index.html +++ /dev/null @@ -1,96 +0,0 @@ -<!-- -/* - * Copyright 2014 ETH Zuerich, Scientific IT Services - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - -<title>FuelUX</title> - -<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.css"> -<link rel="stylesheet" href="lib/fuelux/css/fuelux.css"> - -<script type="text/javascript" src="lib/jquery/js/jquery.js"></script> -<script type="text/javascript" src="lib/bootstrap/js/bootstrap.js"></script> -<script type="text/javascript" src="lib/fuelux/js/fuelux.js"></script> -<script type="text/javascript" src="lib/naturalsort/js/naturalSort.js"></script> -<script type="text/javascript" src="Grid.js"></script> - -</head> - -<body> - - <script type="text/javascript"> - $(function() { - var columns = [ { - label : 'Name', - property : 'name', - sortable : true - }, { - label : 'Age', - property : 'age', - sortable : true - }, { - label : 'Surname', - property : 'surname', - sortable : true - }, { - label : "Full Name", - property : 'fullname', - sortable : true, - render : function(data) { - var fullName = data.name + " " + data.surname; - return $("<button>").text(fullName).click(function() { - alert("My name is: " + fullName); - }); - }, - filter : function(data, filter) { - var fullName = data.name + " " + data.surname; - return fullName.toLowerCase().indexOf(filter) != -1; - }, - sort : function(data1, data2, asc) { - return naturalSort(data1.surname, data2.surname); - } - } ]; - var getDataList = function(callback) { - callback([ { - name : "Name A", - surname : "Surname 1", - age : 21 - }, { - name : "Name B", - surname : "Surname 2", - age : 34 - }, { - name : "Name C", - surname : "Surname 10", - age : 61 - } ]); - }; - var grid = new Grid(columns, getDataList); - - grid.addRowClickListener(function(e) { - console.log("Row clicked - index: " + e.index); - }); - - $("body").append(grid.render()); - }); - </script> - -</body> -</html> diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css deleted file mode 100644 index a4069929bceb661eacbd4b1eb21306cfa5a1c8f9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css +++ /dev/null @@ -1,347 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css.map b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css.map deleted file mode 100644 index b36fc9a4970e41d7a3bfdb67780e93ab18a68faf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/theme.less","less/mixins.less"],"names":[],"mappings":"AAeA;AACA;AACA;AACA;AACA;AACA;EACE,wCAAA;ECoGA,2FAAA;EACQ,mFAAA;;ADhGR,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;AACD,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;EC8FD,wDAAA;EACQ,gDAAA;;ADnER,IAAC;AACD,IAAC;EACC,sBAAA;;AAKJ;EC4PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;EAyB2C,yBAAA;EAA2B,kBAAA;;AAvBtE,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAeJ;EC2PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAgBJ;EC0PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAiBJ;ECyPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,SAAC;AACD,SAAC;EACC,yBAAA;EACA,qBAAA;;AAkBJ;ECwPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAmBJ;ECuPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,WAAC;AACD,WAAC;EACC,yBAAA;EACA,qBAAA;;AA2BJ;AACA;EC6CE,kDAAA;EACQ,0CAAA;;ADpCV,cAAe,KAAK,IAAG;AACvB,cAAe,KAAK,IAAG;ECmOnB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EDpOF,yBAAA;;AAEF,cAAe,UAAU;AACzB,cAAe,UAAU,IAAG;AAC5B,cAAe,UAAU,IAAG;EC6NxB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED9NF,yBAAA;;AAUF;ECiNI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;EDrPA,kBAAA;ECaA,2FAAA;EACQ,mFAAA;;ADjBV,eAOE,YAAY,UAAU;EC0MpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,wDAAA;EACQ,gDAAA;;ADLV;AACA,WAAY,KAAK;EACf,8CAAA;;AAIF;EC+LI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;;ADtOF,eAIE,YAAY,UAAU;EC2LpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,uDAAA;EACQ,+CAAA;;ADCV,eASE;AATF,eAUE,YAAY,KAAK;EACf,yCAAA;;AAKJ;AACA;AACA;EACE,gBAAA;;AAUF;EACE,6CAAA;EChCA,0FAAA;EACQ,kFAAA;;AD2CV;ECqJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAKF;ECoJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAMF;ECmJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAOF;ECkJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAgBF;ECyII,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADlIJ;EC+HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADjIJ;EC8HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADhIJ;EC6HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD/HJ;EC4HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD9HJ;EC2HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtHJ;EACE,kBAAA;EC/EA,kDAAA;EACQ,0CAAA;;ADiFV,gBAAgB;AAChB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;EACrB,6BAAA;EC4GE,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED7GF,qBAAA;;AAUF;ECjGE,iDAAA;EACQ,yCAAA;;AD0GV,cAAe;ECsFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADxFJ,cAAe;ECqFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADvFJ,cAAe;ECoFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtFJ,WAAY;ECmFR,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADrFJ,cAAe;ECkFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADpFJ,aAAc;ECiFV,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD5EJ;ECyEI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED1EF,qBAAA;EC1HA,yFAAA;EACQ,iFAAA","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n"]} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.min.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.min.css deleted file mode 100644 index ba4bd28ae51616917024b5d4a8d2d20b969a9e31..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap-theme.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css deleted file mode 100644 index 7f36651961ed5bc42a712042c6db5493b4ce99e9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css +++ /dev/null @@ -1,5785 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 62.5%; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-muted { - color: #999; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: 0; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: 0; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - max-width: 100%; - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -input[type="date"] { - line-height: 34px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - display: inline; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.has-feedback .form-control-feedback { - position: absolute; - top: 25px; - right: 0; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.form-control-static { - margin-bottom: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -.form-horizontal .form-control-static { - padding-top: 7px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333; - background-color: #ebebeb; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3276b1; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #fff; - background-color: #47a447; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #fff; - background-color: #39b3d7; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ed9c28; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #fff; - background-color: #d2322d; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - transition: height .35s ease; -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #999; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: none; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #999; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .navbar-nav > li > a { - color: #999; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -.label[href]:hover, -.label[href]:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #999; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable { - padding-right: 35px; -} -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} -a.list-group-item.active, -a.list-group-item.active:hover, -a.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -a.list-group-item.active .list-group-item-heading, -a.list-group-item.active:hover .list-group-item-heading, -a.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} -a.list-group-item.active .list-group-item-text, -a.list-group-item.active:hover .list-group-item-text, -a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table { - margin-bottom: 0; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: auto; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -moz-transition: -moz-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 20px; -} -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: none; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css.map b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css.map deleted file mode 100644 index 6bc5a2dc75413860670f9e657d62b64cf15fd195..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/normalize.less","less/print.less","less/scaffolding.less","less/mixins.less","less/variables.less","less/thumbnails.less","less/carousel.less","less/type.less","less/code.less","less/grid.less","less/tables.less","less/forms.less","less/buttons.less","less/button-groups.less","less/component-animations.less","less/glyphicons.less","less/dropdowns.less","less/input-groups.less","less/navs.less","less/navbar.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/pager.less","less/labels.less","less/badges.less","less/jumbotron.less","less/alerts.less","less/progress-bars.less","less/media.less","less/list-group.less","less/panels.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/responsive-utilities.less"],"names":[],"mappings":";AAQA;EACE,uBAAA;EACA,0BAAA;EACA,8BAAA;;AAOF;EACE,SAAA;;AAUF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,cAAA;;AAQF;AACA;AACA;AACA;EACE,qBAAA;EACA,wBAAA;;AAQF,KAAK,IAAI;EACP,aAAA;EACA,SAAA;;AAQF;AACA;EACE,aAAA;;AAUF;EACE,uBAAA;;AAOF,CAAC;AACD,CAAC;EACC,UAAA;;AAUF,IAAI;EACF,yBAAA;;AAOF;AACA;EACE,iBAAA;;AAOF;EACE,kBAAA;;AAQF;EACE,cAAA;EACA,gBAAA;;AAOF;EACE,gBAAA;EACA,WAAA;;AAOF;EACE,cAAA;;AAOF;AACA;EACE,cAAA;EACA,cAAA;EACA,kBAAA;EACA,wBAAA;;AAGF;EACE,WAAA;;AAGF;EACE,eAAA;;AAUF;EACE,SAAA;;AAOF,GAAG,IAAI;EACL,gBAAA;;AAUF;EACE,gBAAA;;AAOF;EACE,4BAAA;EACA,uBAAA;EACA,SAAA;;AAOF;EACE,cAAA;;AAOF;AACA;AACA;AACA;EACE,iCAAA;EACA,cAAA;;AAkBF;AACA;AACA;AACA;AACA;EACE,cAAA;EACA,aAAA;EACA,SAAA;;AAOF;EACE,iBAAA;;AAUF;AACA;EACE,oBAAA;;AAWF;AACA,IAAK,MAAK;AACV,KAAK;AACL,KAAK;EACH,0BAAA;EACA,eAAA;;AAOF,MAAM;AACN,IAAK,MAAK;EACR,eAAA;;AAOF,MAAM;AACN,KAAK;EACH,SAAA;EACA,UAAA;;AAQF;EACE,mBAAA;;AAWF,KAAK;AACL,KAAK;EACH,sBAAA;EACA,UAAA;;AASF,KAAK,eAAe;AACpB,KAAK,eAAe;EAClB,YAAA;;AASF,KAAK;EACH,6BAAA;EACA,4BAAA;EACA,+BAAA;EACA,uBAAA;;AASF,KAAK,eAAe;AACpB,KAAK,eAAe;EAClB,wBAAA;;AAOF;EACE,yBAAA;EACA,aAAA;EACA,8BAAA;;AAQF;EACE,SAAA;EACA,UAAA;;AAOF;EACE,cAAA;;AAQF;EACE,iBAAA;;AAUF;EACE,yBAAA;EACA,iBAAA;;AAGF;AACA;EACE,UAAA;;AChUF;EA9FE;IACE,4BAAA;IACA,sBAAA;IACA,kCAAA;IACA,2BAAA;;EAGF;EACA,CAAC;IACC,0BAAA;;EAGF,CAAC,MAAM;IACL,SAAS,KAAK,WAAW,GAAzB;;EAGF,IAAI,OAAO;IACT,SAAS,KAAK,YAAY,GAA1B;;EAIF,CAAC,qBAAqB;EACtB,CAAC,WAAW;IACV,SAAS,EAAT;;EAGF;EACA;IACE,sBAAA;IACA,wBAAA;;EAGF;IACE,2BAAA;;EAGF;EACA;IACE,wBAAA;;EAGF;IACE,0BAAA;;EAGF;EACA;EACA;IACE,UAAA;IACA,SAAA;;EAGF;EACA;IACE,uBAAA;;EAKF;IACE,2BAAA;;EAIF;IACE,aAAA;;EAEF,MACE;EADF,MAEE;IACE,iCAAA;;EAGJ,IAEE;EADF,OAAQ,OACN;IACE,iCAAA;;EAGJ;IACE,sBAAA;;EAGF;IACE,oCAAA;;EAEF,eACE;EADF,eAEE;IACE,iCAAA;;;ACtFN;ECyOE,8BAAA;EACG,2BAAA;EACK,sBAAA;;ADxOV,CAAC;AACD,CAAC;ECqOC,8BAAA;EACG,2BAAA;EACK,sBAAA;;ADhOV;EACE,gBAAA;EACA,6CAAA;;AAGF;EACE,aEcwB,8CFdxB;EACA,eAAA;EACA,uBAAA;EACA,cAAA;EACA,yBAAA;;AAIF;AACA;AACA;AACA;EACE,oBAAA;EACA,kBAAA;EACA,oBAAA;;AAMF;EACE,cAAA;EACA,qBAAA;;AAEA,CAAC;AACD,CAAC;EACC,cAAA;EACA,0BAAA;;AAGF,CAAC;ECzBD,oBAAA;EAEA,0CAAA;EACA,oBAAA;;ADiCF;EACE,SAAA;;AAMF;EACE,sBAAA;;AAIF;AG1EA,UAUE;AAVF,UAWE,EAAE;ACPJ,eAKE,QAME;AAXJ,eAKE,QAOE,IAAI;EHyWN,cAAA;EACA,eAAA;EACA,YAAA;;AD5SF;EACE,kBAAA;;AAMF;EACE,YAAA;EACA,uBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EC8BA,wCAAA;EACQ,gCAAA;EA+PR,qBAAA;EACA,eAAA;EACA,YAAA;;ADxRF;EACE,kBAAA;;AAMF;EACE,gBAAA;EACA,mBAAA;EACA,SAAA;EACA,6BAAA;;AAQF;EACE,kBAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,gBAAA;EACA,MAAM,gBAAN;EACA,SAAA;;AK5HF;AAAI;AAAI;AAAI;AAAI;AAAI;AACpB;AAAK;AAAK;AAAK;AAAK;AAAK;EACvB,oBAAA;EACA,gBAAA;EACA,gBAAA;EACA,cAAA;;AALF,EAOE;AAPE,EAOF;AAPM,EAON;AAPU,EAOV;AAPc,EAOd;AAPkB,EAOlB;AANF,GAME;AANG,GAMH;AANQ,GAMR;AANa,GAMb;AANkB,GAMlB;AANuB,GAMvB;AAPF,EAQE;AARE,EAQF;AARM,EAQN;AARU,EAQV;AARc,EAQd;AARkB,EAQlB;AAPF,GAOE;AAPG,GAOH;AAPQ,GAOR;AAPa,GAOb;AAPkB,GAOlB;AAPuB,GAOvB;EACE,mBAAA;EACA,cAAA;EACA,cAAA;;AAIJ;AAAI;AACJ;AAAI;AACJ;AAAI;EACF,gBAAA;EACA,mBAAA;;AAJF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;AAJF,EAIE;AAJE,GAIF;AANF,EAOE;AAPE,GAOF;AANF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;EACE,cAAA;;AAGJ;AAAI;AACJ;AAAI;AACJ;AAAI;EACF,gBAAA;EACA,mBAAA;;AAJF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;AAJF,EAIE;AAJE,GAIF;AANF,EAOE;AAPE,GAOF;AANF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;EACE,cAAA;;AAIJ;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AAMV;EACE,gBAAA;;AAGF;EACE,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;;AAKF,QAHqC;EAGrC;IAFI,eAAA;;;AASJ;AACA;EAAU,cAAA;;AAGV;EAAU,kBAAA;;AAGV;EAAuB,gBAAA;;AACvB;EAAuB,iBAAA;;AACvB;EAAuB,kBAAA;;AACvB;EAAuB,mBAAA;;AAGvB;EACE,cAAA;;AAEF;EJofE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AInfJ;EJifE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AIhfJ;EJ8eE,cAAA;;AACA,CAAC,UAAC;EACA,cAAA;;AI7eJ;EJ2eE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AI1eJ;EJweE,cAAA;;AACA,CAAC,YAAC;EACA,cAAA;;AIneJ;EAGE,WAAA;EJqdA,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AIpdJ;EJkdE,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AIjdJ;EJ+cE,yBAAA;;AACA,CAAC,QAAC;EACA,yBAAA;;AI9cJ;EJ4cE,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AI3cJ;EJycE,yBAAA;;AACA,CAAC,UAAC;EACA,yBAAA;;AIncJ;EACE,mBAAA;EACA,mBAAA;EACA,gCAAA;;AAQF;AACA;EACE,aAAA;EACA,mBAAA;;AAHF,EAIE;AAHF,EAGE;AAJF,EAKE;AAJF,EAIE;EACE,gBAAA;;AAOJ;EACE,eAAA;EACA,gBAAA;;AAIF;EALE,eAAA;EACA,gBAAA;EAMA,iBAAA;;AAFF,YAIE;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;;AAKJ;EACE,aAAA;EACA,mBAAA;;AAEF;AACA;EACE,uBAAA;;AAEF;EACE,iBAAA;;AAEF;EACE,cAAA;;AAwBF,QAhB2C;EACzC,cACE;IACE,WAAA;IACA,YAAA;IACA,WAAA;IACA,iBAAA;IJ1IJ,gBAAA;IACA,uBAAA;IACA,mBAAA;;EImIA,cAQE;IACE,kBAAA;;;AAUN,IAAI;AAEJ,IAAI;EACF,YAAA;EACA,iCAAA;;AAEF;EACE,cAAA;EACA,yBAAA;;AAIF;EACE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,8BAAA;;AAKE,UAHF,EAGG;AAAD,UAFF,GAEG;AAAD,UADF,GACG;EACC,gBAAA;;AAVN,UAgBE;AAhBF,UAiBE;AAjBF,UAkBE;EACE,cAAA;EACA,cAAA;EACA,uBAAA;EACA,cAAA;;AAEA,UARF,OAQG;AAAD,UAPF,MAOG;AAAD,UANF,OAMG;EACC,SAAS,aAAT;;AAQN;AACA,UAAU;EACR,mBAAA;EACA,eAAA;EACA,+BAAA;EACA,cAAA;EACA,iBAAA;;AAME,mBAHF,OAGG;AAAD,UAXM,WAQR,OAGG;AAAD,mBAFF,MAEG;AAAD,UAXM,WASR,MAEG;AAAD,mBADF,OACG;AAAD,UAXM,WAUR,OACG;EAAU,SAAS,EAAT;;AACX,mBAJF,OAIG;AAAD,UAZM,WAQR,OAIG;AAAD,mBAHF,MAGG;AAAD,UAZM,WASR,MAGG;AAAD,mBAFF,OAEG;AAAD,UAZM,WAUR,OAEG;EACC,SAAS,aAAT;;AAMN,UAAU;AACV,UAAU;EACR,SAAS,EAAT;;AAIF;EACE,mBAAA;EACA,kBAAA;EACA,uBAAA;;AC7RF;AACA;AACA;AACA;EACE,sCJkCiD,wBIlCjD;;AAIF;EACE,gBAAA;EACA,cAAA;EACA,cAAA;EACA,yBAAA;EACA,mBAAA;EACA,kBAAA;;AAIF;EACE,gBAAA;EACA,cAAA;EACA,cAAA;EACA,yBAAA;EACA,kBAAA;EACA,8CAAA;;AAIF;EACE,cAAA;EACA,cAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,qBAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;;AAXF,GAcE;EACE,UAAA;EACA,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,6BAAA;EACA,gBAAA;;AAKJ;EACE,iBAAA;EACA,kBAAA;;ACpDF;ENqnBE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;;AMlnBA,QAHmC;EAGnC;IAFE,YAAA;;;AAKF,QAHmC;EAGnC;IAFE,YAAA;;;AAKJ,QAHqC;EAGrC;IAFI,aAAA;;;AAUJ;ENimBE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;;AM3lBF;ENimBE,kBAAA;EACA,mBAAA;;AAqIE;EACE,kBAAA;EAEA,eAAA;EAEA,kBAAA;EACA,mBAAA;;AAgBF;EACE,WAAA;;AAOJ,KAAK,EAAQ,CAAC;EACZ,WAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,mBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,kBAAA;;AASF,KAAK,EAAQ,MAAM;EACjB,WAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,mBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AANF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,kBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,iBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,QAAA;;AASF,KAAK,EAAQ,QAAQ;EACnB,iBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,yBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,wBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,eAAA;;AMvvBJ,QALmC;ENouB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,kBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,iBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,wBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AM9uBJ,QALmC;EN2tB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,kBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,iBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,wBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AMvuBJ,QAHmC;ENktB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,mBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,kBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,mBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,kBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,iBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,yBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,wBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AOtzBJ;EACE,eAAA;EACA,6BAAA;;AAEF;EACE,gBAAA;;AAMF;EACE,WAAA;EACA,mBAAA;;AAFF,MAIE,QAGE,KACE;AARN,MAKE,QAEE,KACE;AARN,MAME,QACE,KACE;AARN,MAIE,QAGE,KAEE;AATN,MAKE,QAEE,KAEE;AATN,MAME,QACE,KAEE;EACE,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,6BAAA;;AAbR,MAkBE,QAAQ,KAAK;EACX,sBAAA;EACA,gCAAA;;AApBJ,MAuBE,UAAU,QAGR,KAAI,YACF;AA3BN,MAwBE,WAAW,QAET,KAAI,YACF;AA3BN,MAyBE,QAAO,YACL,KAAI,YACF;AA3BN,MAuBE,UAAU,QAGR,KAAI,YAEF;AA5BN,MAwBE,WAAW,QAET,KAAI,YAEF;AA5BN,MAyBE,QAAO,YACL,KAAI,YAEF;EACE,aAAA;;AA7BR,MAkCE,QAAQ;EACN,6BAAA;;AAnCJ,MAuCE;EACE,yBAAA;;AAOJ,gBACE,QAGE,KACE;AALN,gBAEE,QAEE,KACE;AALN,gBAGE,QACE,KACE;AALN,gBACE,QAGE,KAEE;AANN,gBAEE,QAEE,KAEE;AANN,gBAGE,QACE,KAEE;EACE,YAAA;;AAWR;EACE,yBAAA;;AADF,eAEE,QAGE,KACE;AANN,eAGE,QAEE,KACE;AANN,eAIE,QACE,KACE;AANN,eAEE,QAGE,KAEE;AAPN,eAGE,QAEE,KAEE;AAPN,eAIE,QACE,KAEE;EACE,yBAAA;;AARR,eAYE,QAAQ,KACN;AAbJ,eAYE,QAAQ,KAEN;EACE,wBAAA;;AAUN,cACE,QAAQ,KAAI,UAAU,KACpB;AAFJ,cACE,QAAQ,KAAI,UAAU,KAEpB;EACE,yBAAA;;AAUN,YACE,QAAQ,KAAI,MACV;AAFJ,YACE,QAAQ,KAAI,MAEV;EACE,yBAAA;;AAUN,KAAM,IAAG;EACP,gBAAA;EACA,WAAA;EACA,qBAAA;;AAKE,KAFF,GAEG;AAAD,KADF,GACG;EACC,gBAAA;EACA,WAAA;EACA,mBAAA;;AP0SJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,MAAS;AACX,MANK,QAAQ,KAMZ,CAAC,MAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,MAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,MAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,MAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,MAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,OAAS;AACX,MANK,QAAQ,KAMZ,CAAC,OAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,OAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,OAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,OAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,OAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,IAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,IAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,IAAS;AACX,MANK,QAAQ,KAMZ,CAAC,IAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,IAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,IAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,IAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,IAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,IAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,IAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,OAAS;AACX,MANK,QAAQ,KAMZ,CAAC,OAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,OAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,OAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,OAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,OAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,MAAS;AACX,MANK,QAAQ,KAMZ,CAAC,MAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,MAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,MAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,MAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,MAAQ,MAAO;EACf,yBAAA;;AOpON,QA/DmC;EACjC;IACE,WAAA;IACA,mBAAA;IACA,kBAAA;IACA,kBAAA;IACA,4CAAA;IACA,yBAAA;IACA,iCAAA;;EAPF,iBAUE;IACE,gBAAA;;EAXJ,iBAUE,SAIE,QAGE,KACE;EAlBR,iBAUE,SAKE,QAEE,KACE;EAlBR,iBAUE,SAME,QACE,KACE;EAlBR,iBAUE,SAIE,QAGE,KAEE;EAnBR,iBAUE,SAKE,QAEE,KAEE;EAnBR,iBAUE,SAME,QACE,KAEE;IACE,mBAAA;;EApBV,iBA2BE;IACE,SAAA;;EA5BJ,iBA2BE,kBAIE,QAGE,KACE,KAAI;EAnCZ,iBA2BE,kBAKE,QAEE,KACE,KAAI;EAnCZ,iBA2BE,kBAME,QACE,KACE,KAAI;EAnCZ,iBA2BE,kBAIE,QAGE,KAEE,KAAI;EApCZ,iBA2BE,kBAKE,QAEE,KAEE,KAAI;EApCZ,iBA2BE,kBAME,QACE,KAEE,KAAI;IACF,cAAA;;EArCV,iBA2BE,kBAIE,QAGE,KAKE,KAAI;EAvCZ,iBA2BE,kBAKE,QAEE,KAKE,KAAI;EAvCZ,iBA2BE,kBAME,QACE,KAKE,KAAI;EAvCZ,iBA2BE,kBAIE,QAGE,KAME,KAAI;EAxCZ,iBA2BE,kBAKE,QAEE,KAME,KAAI;EAxCZ,iBA2BE,kBAME,QACE,KAME,KAAI;IACF,eAAA;;EAzCV,iBA2BE,kBAsBE,QAEE,KAAI,WACF;EApDR,iBA2BE,kBAuBE,QACE,KAAI,WACF;EApDR,iBA2BE,kBAsBE,QAEE,KAAI,WAEF;EArDR,iBA2BE,kBAuBE,QACE,KAAI,WAEF;IACE,gBAAA;;;ACxNZ;EACE,UAAA;EACA,SAAA;EACA,SAAA;EAIA,YAAA;;AAGF;EACE,cAAA;EACA,WAAA;EACA,UAAA;EACA,mBAAA;EACA,eAAA;EACA,oBAAA;EACA,cAAA;EACA,SAAA;EACA,gCAAA;;AAGF;EACE,qBAAA;EACA,kBAAA;EACA,iBAAA;;AAWF,KAAK;ERsMH,8BAAA;EACG,2BAAA;EACK,sBAAA;;AQnMV,KAAK;AACL,KAAK;EACH,eAAA;EACA,kBAAA;;EACA,mBAAA;;AAIF,KAAK;EACH,cAAA;;AAIF,KAAK;EACH,cAAA;EACA,WAAA;;AAIF,MAAM;AACN,MAAM;EACJ,YAAA;;AAIF,KAAK,aAAa;AAClB,KAAK,cAAc;AACnB,KAAK,iBAAiB;ER7CpB,oBAAA;EAEA,0CAAA;EACA,oBAAA;;AQ+CF;EACE,cAAA;EACA,gBAAA;EACA,eAAA;EACA,uBAAA;EACA,cAAA;;AA0BF;EACE,cAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,uBAAA;EACA,cAAA;EACA,yBAAA;EACA,sBAAA;EACA,yBAAA;EACA,kBAAA;ERHA,wDAAA;EACQ,gDAAA;EAKR,8EAAA;EACQ,sEAAA;;AAmwBR,aAAC;EACC,qBAAA;EACA,UAAA;EA5wBF,sFAAA;EACQ,8EAAA;;AAlER,aAAC;EAA+B,cAAA;EACA,UAAA;;AAChC,aAAC;EAA+B,cAAA;;AAChC,aAAC;EAA+B,cAAA;;AQgFhC,aAAC;AACD,aAAC;AACD,QAAQ,UAAW;EACjB,mBAAA;EACA,yBAAA;EACA,UAAA;;AAIF,QAAQ;EACN,YAAA;;AAYJ,KAAK;EACH,wBAAA;;AASF,KAAK;EACH,iBAAA;;AASF;EACE,mBAAA;;AAQF;AACA;EACE,cAAA;EACA,gBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;;AANF,MAOE;AANF,SAME;EACE,eAAA;EACA,mBAAA;EACA,eAAA;;AAGJ,MAAO,MAAK;AACZ,aAAc,MAAK;AACnB,SAAU,MAAK;AACf,gBAAiB,MAAK;EACpB,WAAA;EACA,kBAAA;;AAEF,MAAO;AACP,SAAU;EACR,gBAAA;;AAIF;AACA;EACE,qBAAA;EACA,kBAAA;EACA,gBAAA;EACA,sBAAA;EACA,mBAAA;EACA,eAAA;;AAEF,aAAc;AACd,gBAAiB;EACf,aAAA;EACA,iBAAA;;AAYA,KANG,cAMF;AAAD,KALG,iBAKF;AAAD,MAAC;AAAD,aAAC;AAAD,SAAC;AAAD,gBAAC;AACD,QAAQ,UAAW,MAPhB;AAOH,QAAQ,UAAW,MANhB;AAMH,QAAQ,UAAW;AAAnB,QAAQ,UAAW;AAAnB,QAAQ,UAAW;AAAnB,QAAQ,UAAW;EACjB,mBAAA;;AAUJ;ERqpBE,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,MAAM;EACJ,YAAA;EACA,iBAAA;;AAGF,QAAQ;AACR,MAAM,UAAU;EACd,YAAA;;AQ9pBJ;ERipBE,YAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AAEA,MAAM;EACJ,YAAA;EACA,iBAAA;;AAGF,QAAQ;AACR,MAAM,UAAU;EACd,YAAA;;AQrpBJ;EAEE,kBAAA;;AAFF,aAKE;EACE,qBAAA;;AANJ,aAUE;EACE,kBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;;AAKJ,YRsjBE;AQtjBF,YRujBE;AQvjBF,YRwjBE;AQxjBF,YRyjBE;AQzjBF,YR0jBE;AQ1jBF,YR2jBE;EACE,cAAA;;AQ5jBJ,YR+jBE;EACE,qBAAA;EAvuBF,wDAAA;EACQ,gDAAA;;AAwuBN,YAHF,cAGG;EACC,qBAAA;EA1uBJ,yEAAA;EACQ,iEAAA;;AQsKV,YRykBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AQ5kBJ,YR+kBE;EACE,cAAA;;AQ7kBJ,YRmjBE;AQnjBF,YRojBE;AQpjBF,YRqjBE;AQrjBF,YRsjBE;AQtjBF,YRujBE;AQvjBF,YRwjBE;EACE,cAAA;;AQzjBJ,YR4jBE;EACE,qBAAA;EAvuBF,wDAAA;EACQ,gDAAA;;AAwuBN,YAHF,cAGG;EACC,qBAAA;EA1uBJ,yEAAA;EACQ,iEAAA;;AQyKV,YRskBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AQzkBJ,YR4kBE;EACE,cAAA;;AQ1kBJ,URgjBE;AQhjBF,URijBE;AQjjBF,URkjBE;AQljBF,URmjBE;AQnjBF,URojBE;AQpjBF,URqjBE;EACE,cAAA;;AQtjBJ,URyjBE;EACE,qBAAA;EAvuBF,wDAAA;EACQ,gDAAA;;AAwuBN,UAHF,cAGG;EACC,qBAAA;EA1uBJ,yEAAA;EACQ,iEAAA;;AQ4KV,URmkBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AQtkBJ,URykBE;EACE,cAAA;;AQhkBJ;EACE,gBAAA;;AASF;EACE,cAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;;AAoEF,QAjDqC;EAiDrC,YA/CI;IACE,qBAAA;IACA,gBAAA;IACA,sBAAA;;EA4CN,YAxCI;IACE,qBAAA;IACA,WAAA;IACA,sBAAA;;EAqCN,YAlCI,aAAa;IACX,WAAA;;EAiCN,YA9BI;IACE,gBAAA;IACA,sBAAA;;EA4BN,YAtBI;EAsBJ,YArBI;IACE,qBAAA;IACA,aAAA;IACA,gBAAA;IACA,eAAA;IACA,sBAAA;;EAgBN,YAdI,OAAO,MAAK;EAchB,YAbI,UAAU,MAAK;IACb,WAAA;IACA,cAAA;;EAWN,YAJI,cAAc;IACZ,MAAA;;;AAWN,gBAGE;AAHF,gBAIE;AAJF,gBAKE;AALF,gBAME;AANF,gBAOE;EACE,aAAA;EACA,gBAAA;EACA,gBAAA;;AAVJ,gBAcE;AAdF,gBAeE;EACE,gBAAA;;AAhBJ,gBAoBE;ERyOA,kBAAA;EACA,mBAAA;;AQ9PF,gBAwBE;EACE,gBAAA;;AAUF,QANmC;EAMnC,gBALE;IACE,iBAAA;;;AA/BN,gBAuCE,cAAc;EACZ,MAAA;EACA,WAAA;;AC3aJ;EACE,qBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;EACA,mBAAA;ET0gBA,iBAAA;EACA,eAAA;EACA,uBAAA;EACA,kBAAA;EAnSA,yBAAA;EACG,sBAAA;EACC,qBAAA;EACI,iBAAA;;AStON,IAAC;AAAD,IAFD,OAEE;AAAD,IADD,OACE;ETQH,oBAAA;EAEA,0CAAA;EACA,oBAAA;;ASNA,IAAC;AACD,IAAC;EACC,cAAA;EACA,qBAAA;;AAGF,IAAC;AACD,IAAC;EACC,UAAA;EACA,sBAAA;ETmFF,wDAAA;EACQ,gDAAA;;AShFR,IAAC;AACD,IAAC;AACD,QAAQ,UAAW;EACjB,mBAAA;EACA,oBAAA;ET+OF,aAAA;EAGA,yBAAA;EAvKA,wBAAA;EACQ,gBAAA;;ASlEV;ET2bE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AStdV,YT0dE;EACE,cAAA;EACA,yBAAA;;ASzdJ;ETwbE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;ASndV,YTudE;EACE,cAAA;EACA,yBAAA;;ASrdJ;ETobE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AS/cV,YTmdE;EACE,cAAA;EACA,yBAAA;;ASjdJ;ETgbE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;AACD,SAAC;AACD,SAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,SAAC;AACD,SAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,SAHD;AAGC,SAFD;AAEC,QADM,UAAW;AAEjB,SAJD,SAIE;AAAD,SAHD,UAGE;AAAD,QAFM,UAAW,UAEhB;AACD,SALD,SAKE;AAAD,SAJD,UAIE;AAAD,QAHM,UAAW,UAGhB;AACD,SAND,SAME;AAAD,SALD,UAKE;AAAD,QAJM,UAAW,UAIhB;AACD,SAPD,SAOE;AAAD,SAND,UAME;AAAD,QALM,UAAW,UAKhB;EACC,yBAAA;EACI,qBAAA;;AS3cV,ST+cE;EACE,cAAA;EACA,yBAAA;;AS7cJ;ET4aE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;ASvcV,YT2cE;EACE,cAAA;EACA,yBAAA;;ASzcJ;ETwaE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;AACD,WAAC;AACD,WAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WAAC;AACD,WAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,WAHD;AAGC,WAFD;AAEC,QADM,UAAW;AAEjB,WAJD,SAIE;AAAD,WAHD,UAGE;AAAD,QAFM,UAAW,YAEhB;AACD,WALD,SAKE;AAAD,WAJD,UAIE;AAAD,QAHM,UAAW,YAGhB;AACD,WAND,SAME;AAAD,WALD,UAKE;AAAD,QAJM,UAAW,YAIhB;AACD,WAPD,SAOE;AAAD,WAND,UAME;AAAD,QALM,UAAW,YAKhB;EACC,yBAAA;EACI,qBAAA;;ASncV,WTucE;EACE,cAAA;EACA,yBAAA;;AShcJ;EACE,cAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;;AAEA;AACA,SAAC;AACD,SAAC;AACD,QAAQ,UAAW;EACjB,6BAAA;ET2BF,wBAAA;EACQ,gBAAA;;ASzBR;AACA,SAAC;AACD,SAAC;AACD,SAAC;EACC,yBAAA;;AAEF,SAAC;AACD,SAAC;EACC,cAAA;EACA,0BAAA;EACA,6BAAA;;AAIA,SAFD,UAEE;AAAD,QADM,UAAW,UAChB;AACD,SAHD,UAGE;AAAD,QAFM,UAAW,UAEhB;EACC,cAAA;EACA,qBAAA;;AASN;ACvBA,aAAc;EVubZ,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AS/ZF;AC5BA,aAAc;EVwbZ,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AS3ZF;ACjCA,aAAc;EVybZ,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;ASnZF;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,gBAAA;;AAIF,UAAW;EACT,eAAA;;AAOA,KAHG,eAGF;AAAD,KAFG,cAEF;AAAD,KADG,eACF;EACC,WAAA;;AEnJJ;EACE,UAAA;EXqHA,wCAAA;EACQ,gCAAA;;AWpHR,KAAC;EACC,UAAA;;AAIJ;EACE,aAAA;;AACA,SAAC;EACC,cAAA;;AAGJ;EACE,kBAAA;EACA,SAAA;EACA,gBAAA;EXqGA,qCAAA;EACQ,6BAAA;;AYtHV;EACE,aAAa,sBAAb;EACA,qDAAA;EACA,2TAAA;;AAOF;EACE,kBAAA;EACA,QAAA;EACA,qBAAA;EACA,aAAa,sBAAb;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;EACA,mCAAA;EACA,kCAAA;;AAIkC,mBAAC;EAAU,SAAS,KAAT;;AACX,eAAC;EAAU,SAAS,KAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,aAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,aAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,2BAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,0BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,6BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,0BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,2BAAC;EAAU,SAAS,OAAT;;AACX,+BAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,6BAAC;EAAU,SAAS,OAAT;;AACX,iCAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AClO/C;EACE,qBAAA;EACA,QAAA;EACA,SAAA;EACA,gBAAA;EACA,sBAAA;EACA,qBAAA;EACA,mCAAA;EACA,kCAAA;;AAIF;EACE,kBAAA;;AAIF,gBAAgB;EACd,UAAA;;AAIF;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;EACA,WAAA;EACA,gBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;EACA,eAAA;EACA,yBAAA;EACA,yBAAA;EACA,qCAAA;EACA,kBAAA;Eb8EA,mDAAA;EACQ,2CAAA;Ea7ER,4BAAA;;AAKA,cAAC;EACC,QAAA;EACA,UAAA;;AAxBJ,cA4BE;EboVA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,yBAAA;;AanXF,cAiCE,KAAK;EACH,cAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,uBAAA;EACA,cAAA;EACA,mBAAA;;AAMF,cADa,KAAK,IACjB;AACD,cAFa,KAAK,IAEjB;EACC,qBAAA;EACA,cAAA;EACA,yBAAA;;AAMF,cADa,UAAU;AAEvB,cAFa,UAAU,IAEtB;AACD,cAHa,UAAU,IAGtB;EACC,cAAA;EACA,qBAAA;EACA,UAAA;EACA,yBAAA;;AASF,cADa,YAAY;AAEzB,cAFa,YAAY,IAExB;AACD,cAHa,YAAY,IAGxB;EACC,cAAA;;AAKF,cADa,YAAY,IACxB;AACD,cAFa,YAAY,IAExB;EACC,qBAAA;EACA,6BAAA;EACA,sBAAA;EbkPF,mEAAA;EahPE,mBAAA;;AAKJ,KAEE;EACE,cAAA;;AAHJ,KAOE;EACE,UAAA;;AAQJ;EACE,UAAA;EACA,QAAA;;AAQF;EACE,OAAA;EACA,WAAA;;AAIF;EACE,cAAA;EACA,iBAAA;EACA,eAAA;EACA,uBAAA;EACA,cAAA;;AAIF;EACE,eAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA;EACA,YAAA;;AAIF,WAAY;EACV,QAAA;EACA,UAAA;;AAQF,OAGE;AAFF,oBAAqB,UAEnB;EACE,aAAA;EACA,wBAAA;EACA,SAAS,EAAT;;AANJ,OASE;AARF,oBAAqB,UAQnB;EACE,SAAA;EACA,YAAA;EACA,kBAAA;;AAsBJ,QAb2C;EACzC,aACE;IAnEF,UAAA;IACA,QAAA;;EAiEA,aAME;IA9DF,OAAA;IACA,WAAA;;;AH7IF;AACA;EACE,kBAAA;EACA,qBAAA;EACA,sBAAA;;AAJF,UAKE;AAJF,mBAIE;EACE,kBAAA;EACA,WAAA;;AAEA,UAJF,OAIG;AAAD,mBAJF,OAIG;AACD,UALF,OAKG;AAAD,mBALF,OAKG;AACD,UANF,OAMG;AAAD,mBANF,OAMG;AACD,UAPF,OAOG;AAAD,mBAPF,OAOG;EACC,UAAA;;AAEF,UAVF,OAUG;AAAD,mBAVF,OAUG;EAEC,aAAA;;AAMN,UACE,KAAK;AADP,UAEE,KAAK;AAFP,UAGE,WAAW;AAHb,UAIE,WAAW;EACT,iBAAA;;AAKJ;EACE,iBAAA;;AADF,YAIE;AAJF,YAKE;EACE,WAAA;;AANJ,YAQE;AARF,YASE;AATF,YAUE;EACE,gBAAA;;AAIJ,UAAW,OAAM,IAAI,cAAc,IAAI,aAAa,IAAI;EACtD,gBAAA;;AAIF,UAAW,OAAM;EACf,cAAA;;AACA,UAFS,OAAM,YAEd,IAAI,aAAa,IAAI;EV2CtB,6BAAA;EACG,0BAAA;;AUvCL,UAAW,OAAM,WAAW,IAAI;AAChC,UAAW,mBAAkB,IAAI;EV6C/B,4BAAA;EACG,yBAAA;;AUzCL,UAAW;EACT,WAAA;;AAEF,UAAW,aAAY,IAAI,cAAc,IAAI,aAAc;EACzD,gBAAA;;AAEF,UAAW,aAAY,YACrB,OAAM;AADR,UAAW,aAAY,YAErB;EVwBA,6BAAA;EACG,0BAAA;;AUrBL,UAAW,aAAY,WAAY,OAAM;EV4BvC,4BAAA;EACG,yBAAA;;AUxBL,UAAW,iBAAgB;AAC3B,UAAU,KAAM;EACd,UAAA;;AAiBF,UAAW,OAAO;EAChB,iBAAA;EACA,kBAAA;;AAEF,UAAW,UAAU;EACnB,kBAAA;EACA,mBAAA;;AAKF,UAAU,KAAM;EVGd,wDAAA;EACQ,gDAAA;;AUAR,UAJQ,KAAM,iBAIb;EVDD,wBAAA;EACQ,gBAAA;;AUOV,IAAK;EACH,cAAA;;AAGF,OAAQ;EACN,uBAAA;EACA,sBAAA;;AAGF,OAAQ,QAAQ;EACd,uBAAA;;AAOF,mBACE;AADF,mBAEE;AAFF,mBAGE,aAAa;EACX,cAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;;AAPJ,mBAWE,aAEE;EACE,WAAA;;AAdN,mBAkBE,OAAO;AAlBT,mBAmBE,OAAO;AAnBT,mBAoBE,aAAa;AApBf,mBAqBE,aAAa;EACX,gBAAA;EACA,cAAA;;AAKF,mBADkB,OACjB,IAAI,cAAc,IAAI;EACrB,gBAAA;;AAEF,mBAJkB,OAIjB,YAAY,IAAI;EACf,4BAAA;EVvEF,6BAAA;EACC,4BAAA;;AUyED,mBARkB,OAQjB,WAAW,IAAI;EACd,8BAAA;EVnFF,0BAAA;EACC,yBAAA;;AUsFH,mBAAoB,aAAY,IAAI,cAAc,IAAI,aAAc;EAClE,gBAAA;;AAEF,mBAAoB,aAAY,YAAY,IAAI,aAC9C,OAAM;AADR,mBAAoB,aAAY,YAAY,IAAI,aAE9C;EVpFA,6BAAA;EACC,4BAAA;;AUuFH,mBAAoB,aAAY,WAAW,IAAI,cAAe,OAAM;EVhGlE,0BAAA;EACC,yBAAA;;AUwGH;EACE,cAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AAJF,oBAKE;AALF,oBAME;EACE,WAAA;EACA,mBAAA;EACA,SAAA;;AATJ,oBAWE,aAAa;EACX,WAAA;;AAMJ,uBAAwB,OAAO,QAAO;AACtC,uBAAwB,OAAO,QAAO;EACpC,aAAA;;AI1NF;EACE,kBAAA;EACA,cAAA;EACA,yBAAA;;AAGA,YAAC;EACC,WAAA;EACA,eAAA;EACA,gBAAA;;AATJ,YAYE;EAGE,kBAAA;EACA,UAAA;EAKA,WAAA;EAEA,WAAA;EACA,gBAAA;;AASJ,eAAgB;AAChB,eAAgB;AAChB,eAAgB,mBAAmB;Edw2BjC,YAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AAEA,MAAM,ech3BQ;Adg3Bd,MAAM,ec/2BQ;Ad+2Bd,MAAM,ec92BQ,mBAAmB;Ed+2B/B,YAAA;EACA,iBAAA;;AAGF,QAAQ,ecr3BM;Adq3Bd,QAAQ,ecp3BM;Ado3Bd,QAAQ,ecn3BM,mBAAmB;Ado3BjC,MAAM,UAAU,ect3BF;Ads3Bd,MAAM,UAAU,ecr3BF;Adq3Bd,MAAM,UAAU,ecp3BF,mBAAmB;Edq3B/B,YAAA;;Acp3BJ,eAAgB;AAChB,eAAgB;AAChB,eAAgB,mBAAmB;Edq2BjC,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,MAAM,ec72BQ;Ad62Bd,MAAM,ec52BQ;Ad42Bd,MAAM,ec32BQ,mBAAmB;Ed42B/B,YAAA;EACA,iBAAA;;AAGF,QAAQ,ecl3BM;Adk3Bd,QAAQ,ecj3BM;Adi3Bd,QAAQ,ech3BM,mBAAmB;Adi3BjC,MAAM,UAAU,ecn3BF;Adm3Bd,MAAM,UAAU,ecl3BF;Adk3Bd,MAAM,UAAU,ecj3BF,mBAAmB;Edk3B/B,YAAA;;Ac72BJ;AACA;AACA,YAAa;EACX,mBAAA;;AAEA,kBAAC,IAAI,cAAc,IAAI;AAAvB,gBAAC,IAAI,cAAc,IAAI;AAAvB,YAHW,cAGV,IAAI,cAAc,IAAI;EACrB,gBAAA;;AAIJ;AACA;EACE,SAAA;EACA,mBAAA;EACA,sBAAA;;AAKF;EACE,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;;AAGA,kBAAC;EACC,iBAAA;EACA,eAAA;EACA,kBAAA;;AAEF,kBAAC;EACC,kBAAA;EACA,eAAA;EACA,kBAAA;;AApBJ,kBAwBE,MAAK;AAxBP,kBAyBE,MAAK;EACH,aAAA;;AAKJ,YAAa,cAAa;AAC1B,kBAAkB;AAClB,gBAAgB,YAAa;AAC7B,gBAAgB,YAAa,aAAa;AAC1C,gBAAgB,YAAa;AAC7B,gBAAgB,WAAY,OAAM,IAAI,aAAa,IAAI;AACvD,gBAAgB,WAAY,aAAY,IAAI,aAAc;EdFxD,6BAAA;EACG,0BAAA;;AcIL,kBAAkB;EAChB,eAAA;;AAEF,YAAa,cAAa;AAC1B,kBAAkB;AAClB,gBAAgB,WAAY;AAC5B,gBAAgB,WAAY,aAAa;AACzC,gBAAgB,WAAY;AAC5B,gBAAgB,YAAa,OAAM,IAAI;AACvC,gBAAgB,YAAa,aAAY,IAAI,cAAe;EdN1D,4BAAA;EACG,yBAAA;;AcQL,kBAAkB;EAChB,cAAA;;AAKF;EACE,kBAAA;EAGA,YAAA;EACA,mBAAA;;AALF,gBASE;EACE,kBAAA;;AAVJ,gBASE,OAEE;EACE,iBAAA;;AAGF,gBANF,OAMG;AACD,gBAPF,OAOG;AACD,gBARF,OAQG;EACC,UAAA;;AAKJ,gBAAC,YACC;AADF,gBAAC,YAEC;EACE,kBAAA;;AAGJ,gBAAC,WACC;AADF,gBAAC,WAEC;EACE,iBAAA;;ACtJN;EACE,gBAAA;EACA,eAAA;EACA,gBAAA;;AAHF,IAME;EACE,kBAAA;EACA,cAAA;;AARJ,IAME,KAIE;EACE,kBAAA;EACA,cAAA;EACA,kBAAA;;AACA,IARJ,KAIE,IAIG;AACD,IATJ,KAIE,IAKG;EACC,qBAAA;EACA,yBAAA;;AAKJ,IAhBF,KAgBG,SAAU;EACT,cAAA;;AAEA,IAnBJ,KAgBG,SAAU,IAGR;AACD,IApBJ,KAgBG,SAAU,IAIR;EACC,cAAA;EACA,qBAAA;EACA,6BAAA;EACA,mBAAA;;AAOJ,IADF,MAAM;AAEJ,IAFF,MAAM,IAEH;AACD,IAHF,MAAM,IAGH;EACC,yBAAA;EACA,qBAAA;;AAzCN,IAkDE;EfkVA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,yBAAA;;AevYF,IAyDE,KAAK,IAAI;EACP,eAAA;;AASJ;EACE,gCAAA;;AADF,SAEE;EACE,WAAA;EAEA,mBAAA;;AALJ,SAEE,KAME;EACE,iBAAA;EACA,uBAAA;EACA,6BAAA;EACA,0BAAA;;AACA,SAXJ,KAME,IAKG;EACC,qCAAA;;AAMF,SAlBJ,KAiBG,OAAQ;AAEP,SAnBJ,KAiBG,OAAQ,IAEN;AACD,SApBJ,KAiBG,OAAQ,IAGN;EACC,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,gCAAA;EACA,eAAA;;AAKN,SAAC;EAqDD,WAAA;EA8BA,gBAAA;;AAnFA,SAAC,cAuDD;EACE,WAAA;;AAxDF,SAAC,cAuDD,KAEG;EACC,kBAAA;EACA,kBAAA;;AA3DJ,SAAC,cA+DD,YAAY;EACV,SAAA;EACA,UAAA;;AAYJ,QATqC;EASrC,SA7EG,cAqEC;IACE,mBAAA;IACA,SAAA;;EAMN,SA7EG,cAqEC,KAGE;IACE,gBAAA;;;AAzEN,SAAC,cAqFD,KAAK;EAEH,eAAA;EACA,kBAAA;;AAxFF,SAAC,cA2FD,UAAU;AA3FV,SAAC,cA4FD,UAAU,IAAG;AA5Fb,SAAC,cA6FD,UAAU,IAAG;EACX,yBAAA;;AAcJ,QAXqC;EAWrC,SA5GG,cAkGC,KAAK;IACH,gCAAA;IACA,0BAAA;;EAQN,SA5GG,cAsGC,UAAU;EAMd,SA5GG,cAuGC,UAAU,IAAG;EAKjB,SA5GG,cAwGC,UAAU,IAAG;IACX,4BAAA;;;AAhGN,UACE;EACE,WAAA;;AAFJ,UACE,KAIE;EACE,kBAAA;;AANN,UACE,KAOE;EACE,gBAAA;;AAKA,UAbJ,KAYG,OAAQ;AAEP,UAdJ,KAYG,OAAQ,IAEN;AACD,UAfJ,KAYG,OAAQ,IAGN;EACC,cAAA;EACA,yBAAA;;AAQR,YACE;EACE,WAAA;;AAFJ,YACE,KAEE;EACE,eAAA;EACA,cAAA;;AAYN;EACE,WAAA;;AADF,cAGE;EACE,WAAA;;AAJJ,cAGE,KAEG;EACC,kBAAA;EACA,kBAAA;;AAPN,cAWE,YAAY;EACV,SAAA;EACA,UAAA;;AAYJ,QATqC;EASrC,cARI;IACE,mBAAA;IACA,SAAA;;EAMN,cARI,KAGE;IACE,gBAAA;;;AASR;EACE,gBAAA;;AADF,mBAGE,KAAK;EAEH,eAAA;EACA,kBAAA;;AANJ,mBASE,UAAU;AATZ,mBAUE,UAAU,IAAG;AAVf,mBAWE,UAAU,IAAG;EACX,yBAAA;;AAcJ,QAXqC;EAWrC,mBAVI,KAAK;IACH,gCAAA;IACA,0BAAA;;EAQN,mBANI,UAAU;EAMd,mBALI,UAAU,IAAG;EAKjB,mBAJI,UAAU,IAAG;IACX,4BAAA;;;AAUN,YACE;EACE,aAAA;;AAFJ,YAIE;EACE,cAAA;;AASJ,SAAU;EAER,gBAAA;Ef3IA,0BAAA;EACC,yBAAA;;AgB1FH;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;EACA,6BAAA;;AAQF,QAH6C;EAG7C;IAFI,kBAAA;;;AAgBJ,QAH6C;EAG7C;IAFI,WAAA;;;AAeJ;EACE,iBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;EACA,iCAAA;EACA,kDAAA;EAEA,iCAAA;;AAEA,gBAAC;EACC,gBAAA;;AA4BJ,QAzB6C;EAyB7C;IAxBI,WAAA;IACA,aAAA;IACA,gBAAA;;EAEA,gBAAC;IACC,yBAAA;IACA,uBAAA;IACA,iBAAA;IACA,4BAAA;;EAGF,gBAAC;IACC,mBAAA;;EAKF,iBAAkB;EAClB,kBAAmB;EACnB,oBAAqB;IACnB,eAAA;IACA,gBAAA;;;AAUN,UAEE;AADF,gBACE;AAFF,UAGE;AAFF,gBAEE;EACE,mBAAA;EACA,kBAAA;;AAMF,QAJ6C;EAI7C,UATA;EASA,gBATA;EASA,UARA;EAQA,gBARA;IAKI,eAAA;IACA,cAAA;;;AAaN;EACE,aAAA;EACA,qBAAA;;AAKF,QAH6C;EAG7C;IAFI,gBAAA;;;AAKJ;AACA;EACE,eAAA;EACA,QAAA;EACA,OAAA;EACA,aAAA;;AAMF,QAH6C;EAG7C;EAAA;IAFI,gBAAA;;;AAGJ;EACE,MAAA;EACA,qBAAA;;AAEF;EACE,SAAA;EACA,gBAAA;EACA,qBAAA;;AAMF;EACE,WAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,YAAA;;AAEA,aAAC;AACD,aAAC;EACC,qBAAA;;AASJ,QAN6C;EACzC,OAAQ,aAAa;EACrB,OAAQ,mBAAmB;IACzB,kBAAA;;;AAWN;EACE,kBAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EhBsaA,eAAA;EACA,kBAAA;EgBraA,6BAAA;EACA,sBAAA;EACA,6BAAA;EACA,kBAAA;;AAIA,cAAC;EACC,aAAA;;AAdJ,cAkBE;EACE,cAAA;EACA,WAAA;EACA,WAAA;EACA,kBAAA;;AAtBJ,cAwBE,UAAU;EACR,eAAA;;AAMJ,QAH6C;EAG7C;IAFI,aAAA;;;AAUJ;EACE,mBAAA;;AADF,WAGE,KAAK;EACH,iBAAA;EACA,oBAAA;EACA,iBAAA;;AA2BF,QAxB+C;EAwB/C,WAtBE,MAAM;IACJ,gBAAA;IACA,WAAA;IACA,WAAA;IACA,aAAA;IACA,6BAAA;IACA,SAAA;IACA,gBAAA;;EAeJ,WAtBE,MAAM,eAQJ,KAAK;EAcT,WAtBE,MAAM,eASJ;IACE,0BAAA;;EAYN,WAtBE,MAAM,eAYJ,KAAK;IACH,iBAAA;;EACA,WAdJ,MAAM,eAYJ,KAAK,IAEF;EACD,WAfJ,MAAM,eAYJ,KAAK,IAGF;IACC,sBAAA;;;AAuBV,QAhB6C;EAgB7C;IAfI,WAAA;IACA,SAAA;;EAcJ,WAZI;IACE,WAAA;;EAWN,WAZI,KAEE;IACE,iBAAA;IACA,oBAAA;;EAIJ,WAAC,aAAa;IACZ,mBAAA;;;AAkBN,QAN2C;EACzC;ICnQA,sBAAA;;EDoQA;ICvQA,uBAAA;;;ADgRF;EACE,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,iCAAA;EACA,oCAAA;EhB3KA,4FAAA;EACQ,oFAAA;EAkeR,eAAA;EACA,kBAAA;;AQ3NF,QAjDqC;EAiDrC,YA/CI;IACE,qBAAA;IACA,gBAAA;IACA,sBAAA;;EA4CN,YAxCI;IACE,qBAAA;IACA,WAAA;IACA,sBAAA;;EAqCN,YAlCI,aAAa;IACX,WAAA;;EAiCN,YA9BI;IACE,gBAAA;IACA,sBAAA;;EA4BN,YAtBI;EAsBJ,YArBI;IACE,qBAAA;IACA,aAAA;IACA,gBAAA;IACA,eAAA;IACA,sBAAA;;EAgBN,YAdI,OAAO,MAAK;EAchB,YAbI,UAAU,MAAK;IACb,WAAA;IACA,cAAA;;EAWN,YAJI,cAAc;IACZ,MAAA;;;AQhFJ,QAHiD;EAGjD,YAJA;IAEI,kBAAA;;;AAsBN,QAd6C;EAc7C;IAbI,WAAA;IACA,SAAA;IACA,cAAA;IACA,eAAA;IACA,cAAA;IACA,iBAAA;IhBlMF,wBAAA;IACQ,gBAAA;;EgBqMN,YAAC,aAAa;IACZ,mBAAA;;;AASN,WAAY,KAAK;EACf,aAAA;EhBvOA,0BAAA;EACC,yBAAA;;AgB0OH,oBAAqB,YAAY,KAAK;EhBnOpC,6BAAA;EACC,4BAAA;;AgB2OH;EhBqQE,eAAA;EACA,kBAAA;;AgBnQA,WAAC;EhBkQD,gBAAA;EACA,mBAAA;;AgBhQA,WAAC;EhB+PD,gBAAA;EACA,mBAAA;;AgBtPF;EhBqPE,gBAAA;EACA,mBAAA;;AgBzOF,QAV6C;EAU7C;IATI,WAAA;IACA,iBAAA;IACA,kBAAA;;EAGA,YAAC,aAAa;IACZ,eAAA;;;AASN;EACE,yBAAA;EACA,qBAAA;;AAFF,eAIE;EACE,cAAA;;AACA,eAFF,cAEG;AACD,eAHF,cAGG;EACC,cAAA;EACA,6BAAA;;AATN,eAaE;EACE,cAAA;;AAdJ,eAiBE,YACE,KAAK;EACH,cAAA;;AAEA,eAJJ,YACE,KAAK,IAGF;AACD,eALJ,YACE,KAAK,IAIF;EACC,cAAA;EACA,6BAAA;;AAIF,eAXJ,YAUE,UAAU;AAER,eAZJ,YAUE,UAAU,IAEP;AACD,eAbJ,YAUE,UAAU,IAGP;EACC,cAAA;EACA,yBAAA;;AAIF,eAnBJ,YAkBE,YAAY;AAEV,eApBJ,YAkBE,YAAY,IAET;AACD,eArBJ,YAkBE,YAAY,IAGT;EACC,cAAA;EACA,6BAAA;;AAxCR,eA6CE;EACE,qBAAA;;AACA,eAFF,eAEG;AACD,eAHF,eAGG;EACC,yBAAA;;AAjDN,eA6CE,eAME;EACE,yBAAA;;AApDN,eAwDE;AAxDF,eAyDE;EACE,qBAAA;;AAOE,eAHJ,YAEE,QAAQ;AAEN,eAJJ,YAEE,QAAQ,IAEL;AACD,eALJ,YAEE,QAAQ,IAGL;EACC,yBAAA;EACA,cAAA;;AAiCN,QA7BiD;EA6BjD,eAxCA,YAaI,MAAM,eACJ,KAAK;IACH,cAAA;;EACA,eAhBR,YAaI,MAAM,eACJ,KAAK,IAEF;EACD,eAjBR,YAaI,MAAM,eACJ,KAAK,IAGF;IACC,cAAA;IACA,6BAAA;;EAIF,eAvBR,YAaI,MAAM,eASJ,UAAU;EAER,eAxBR,YAaI,MAAM,eASJ,UAAU,IAEP;EACD,eAzBR,YAaI,MAAM,eASJ,UAAU,IAGP;IACC,cAAA;IACA,yBAAA;;EAIF,eA/BR,YAaI,MAAM,eAiBJ,YAAY;EAEV,eAhCR,YAaI,MAAM,eAiBJ,YAAY,IAET;EACD,eAjCR,YAaI,MAAM,eAiBJ,YAAY,IAGT;IACC,cAAA;IACA,6BAAA;;;AAjGZ,eA6GE;EACE,cAAA;;AACA,eAFF,aAEG;EACC,cAAA;;AAQN;EACE,yBAAA;EACA,qBAAA;;AAFF,eAIE;EACE,cAAA;;AACA,eAFF,cAEG;AACD,eAHF,cAGG;EACC,cAAA;EACA,6BAAA;;AATN,eAaE;EACE,cAAA;;AAdJ,eAiBE,YACE,KAAK;EACH,cAAA;;AAEA,eAJJ,YACE,KAAK,IAGF;AACD,eALJ,YACE,KAAK,IAIF;EACC,cAAA;EACA,6BAAA;;AAIF,eAXJ,YAUE,UAAU;AAER,eAZJ,YAUE,UAAU,IAEP;AACD,eAbJ,YAUE,UAAU,IAGP;EACC,cAAA;EACA,yBAAA;;AAIF,eAnBJ,YAkBE,YAAY;AAEV,eApBJ,YAkBE,YAAY,IAET;AACD,eArBJ,YAkBE,YAAY,IAGT;EACC,cAAA;EACA,6BAAA;;AAxCR,eA8CE;EACE,qBAAA;;AACA,eAFF,eAEG;AACD,eAHF,eAGG;EACC,yBAAA;;AAlDN,eA8CE,eAME;EACE,yBAAA;;AArDN,eAyDE;AAzDF,eA0DE;EACE,qBAAA;;AAME,eAFJ,YACE,QAAQ;AAEN,eAHJ,YACE,QAAQ,IAEL;AACD,eAJJ,YACE,QAAQ,IAGL;EACC,yBAAA;EACA,cAAA;;AAuCN,QAnCiD;EAmCjD,eA7CA,YAYI,MAAM,eACJ;IACE,qBAAA;;EA+BR,eA7CA,YAYI,MAAM,eAIJ;IACE,yBAAA;;EA4BR,eA7CA,YAYI,MAAM,eAOJ,KAAK;IACH,cAAA;;EACA,eArBR,YAYI,MAAM,eAOJ,KAAK,IAEF;EACD,eAtBR,YAYI,MAAM,eAOJ,KAAK,IAGF;IACC,cAAA;IACA,6BAAA;;EAIF,eA5BR,YAYI,MAAM,eAeJ,UAAU;EAER,eA7BR,YAYI,MAAM,eAeJ,UAAU,IAEP;EACD,eA9BR,YAYI,MAAM,eAeJ,UAAU,IAGP;IACC,cAAA;IACA,yBAAA;;EAIF,eApCR,YAYI,MAAM,eAuBJ,YAAY;EAEV,eArCR,YAYI,MAAM,eAuBJ,YAAY,IAET;EACD,eAtCR,YAYI,MAAM,eAuBJ,YAAY,IAGT;IACC,cAAA;IACA,6BAAA;;;AAvGZ,eA8GE;EACE,cAAA;;AACA,eAFF,aAEG;EACC,cAAA;;AE9lBN;EACE,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,yBAAA;EACA,kBAAA;;AALF,WAOE;EACE,qBAAA;;AARJ,WAOE,KAGE,KAAI;EACF,SAAS,QAAT;EACA,cAAA;EACA,cAAA;;AAbN,WAiBE;EACE,cAAA;;ACpBJ;EACE,qBAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;;AAJF,WAME;EACE,eAAA;;AAPJ,WAME,KAEE;AARJ,WAME,KAGE;EACE,kBAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,iBAAA;;AAEF,WAdF,KAcG,YACC;AADF,WAdF,KAcG,YAEC;EACE,cAAA;EnBqFN,8BAAA;EACG,2BAAA;;AmBlFD,WArBF,KAqBG,WACC;AADF,WArBF,KAqBG,WAEC;EnBuEJ,+BAAA;EACG,4BAAA;;AmBhED,WAFF,KAAK,IAEF;AAAD,WADF,KAAK,OACF;AACD,WAHF,KAAK,IAGF;AAAD,WAFF,KAAK,OAEF;EACC,cAAA;EACA,yBAAA;EACA,qBAAA;;AAMF,WAFF,UAAU;AAER,WADF,UAAU;AAER,WAHF,UAAU,IAGP;AAAD,WAFF,UAAU,OAEP;AACD,WAJF,UAAU,IAIP;AAAD,WAHF,UAAU,OAGP;EACC,UAAA;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,eAAA;;AAtDN,WA0DE,YACE;AA3DJ,WA0DE,YAEE,OAAM;AA5DV,WA0DE,YAGE,OAAM;AA7DV,WA0DE,YAIE;AA9DJ,WA0DE,YAKE,IAAG;AA/DP,WA0DE,YAME,IAAG;EACD,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,mBAAA;;AASN,cnBodE,KACE;AmBrdJ,cnBodE,KAEE;EACE,kBAAA;EACA,eAAA;;AAEF,cANF,KAMG,YACC;AADF,cANF,KAMG,YAEC;EA7bJ,8BAAA;EACG,2BAAA;;AAgcD,cAZF,KAYG,WACC;AADF,cAZF,KAYG,WAEC;EA3cJ,+BAAA;EACG,4BAAA;;AmBnBL,cnB+cE,KACE;AmBhdJ,cnB+cE,KAEE;EACE,iBAAA;EACA,eAAA;;AAEF,cANF,KAMG,YACC;AADF,cANF,KAMG,YAEC;EA7bJ,8BAAA;EACG,2BAAA;;AAgcD,cAZF,KAYG,WACC;AADF,cAZF,KAYG,WAEC;EA3cJ,+BAAA;EACG,4BAAA;;AoBnGL;EACE,eAAA;EACA,cAAA;EACA,gBAAA;EACA,kBAAA;;AAJF,MAME;EACE,eAAA;;AAPJ,MAME,GAEE;AARJ,MAME,GAGE;EACE,qBAAA;EACA,iBAAA;EACA,yBAAA;EACA,yBAAA;EACA,mBAAA;;AAdN,MAME,GAWE,IAAG;AAjBP,MAME,GAYE,IAAG;EACD,qBAAA;EACA,yBAAA;;AApBN,MAwBE,MACE;AAzBJ,MAwBE,MAEE;EACE,YAAA;;AA3BN,MA+BE,UACE;AAhCJ,MA+BE,UAEE;EACE,WAAA;;AAlCN,MAsCE,UACE;AAvCJ,MAsCE,UAEE,IAAG;AAxCP,MAsCE,UAGE,IAAG;AAzCP,MAsCE,UAIE;EACE,cAAA;EACA,yBAAA;EACA,mBAAA;;AC9CN;EACE,eAAA;EACA,uBAAA;EACA,cAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;;AAIE,MADD,MACE;AACD,MAFD,MAEE;EACC,cAAA;EACA,qBAAA;EACA,eAAA;;AAKJ,MAAC;EACC,aAAA;;AAIF,IAAK;EACH,kBAAA;EACA,SAAA;;AAOJ;ErBmhBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AqBnhBN;ErB+gBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AqB/gBN;ErB2gBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AqB3gBN;ErBugBE,yBAAA;;AAEE,WADD,MACE;AACD,WAFD,MAEE;EACC,yBAAA;;AqBvgBN;ErBmgBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AqBngBN;ErB+fE,yBAAA;;AAEE,aADD,MACE;AACD,aAFD,MAEE;EACC,yBAAA;;AsB1jBN;EACE,qBAAA;EACA,eAAA;EACA,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,wBAAA;EACA,mBAAA;EACA,kBAAA;EACA,yBAAA;EACA,mBAAA;;AAGA,MAAC;EACC,aAAA;;AAIF,IAAK;EACH,kBAAA;EACA,SAAA;;AAEF,OAAQ;EACN,MAAA;EACA,gBAAA;;AAMF,CADD,MACE;AACD,CAFD,MAEE;EACC,cAAA;EACA,qBAAA;EACA,eAAA;;AAKJ,CAAC,gBAAgB,OAAQ;AACzB,UAAW,UAAU,IAAI;EACvB,cAAA;EACA,yBAAA;;AAEF,UAAW,KAAK,IAAI;EAClB,gBAAA;;AChDF;EACE,aAAA;EACA,mBAAA;EACA,cAAA;EACA,yBAAA;;AAJF,UAME;AANF,UAOE;EACE,cAAA;;AARJ,UAUE;EACE,mBAAA;EACA,eAAA;EACA,gBAAA;;AAGF,UAAW;EACT,kBAAA;;AAjBJ,UAoBE;EACE,eAAA;;AAiBJ,mBAdgD;EAchD;IAbI,iBAAA;IACA,oBAAA;;EAEA,UAAW;IACT,kBAAA;IACA,mBAAA;;EAQN,UALI;EAKJ,UAJI;IACE,eAAA;;;ArBlCN;EACE,cAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EFkHA,wCAAA;EACQ,gCAAA;;AE1HV,UAUE;AAVF,UAWE,EAAE;EAEA,iBAAA;EACA,kBAAA;;AAIF,CAAC,UAAC;AACF,CAAC,UAAC;AACF,CAAC,UAAC;EACA,qBAAA;;AArBJ,UAyBE;EACE,YAAA;EACA,cAAA;;AsBzBJ;EACE,aAAA;EACA,mBAAA;EACA,6BAAA;EACA,kBAAA;;AAJF,MAOE;EACE,aAAA;EAEA,cAAA;;AAVJ,MAaE;EACE,iBAAA;;AAdJ,MAkBE;AAlBF,MAmBE;EACE,gBAAA;;AApBJ,MAsBE,IAAI;EACF,eAAA;;AAQJ;EACC,mBAAA;;AADD,kBAIE;EACE,kBAAA;EACA,SAAA;EACA,YAAA;EACA,cAAA;;AAQJ;ExBmXE,yBAAA;EACA,qBAAA;EACA,cAAA;;AwBrXF,cxBuXE;EACE,yBAAA;;AwBxXJ,cxB0XE;EACE,cAAA;;AwBxXJ;ExBgXE,yBAAA;EACA,qBAAA;EACA,cAAA;;AwBlXF,WxBoXE;EACE,yBAAA;;AwBrXJ,WxBuXE;EACE,cAAA;;AwBrXJ;ExB6WE,yBAAA;EACA,qBAAA;EACA,cAAA;;AwB/WF,cxBiXE;EACE,yBAAA;;AwBlXJ,cxBoXE;EACE,cAAA;;AwBlXJ;ExB0WE,yBAAA;EACA,qBAAA;EACA,cAAA;;AwB5WF,axB8WE;EACE,yBAAA;;AwB/WJ,axBiXE;EACE,cAAA;;AyBzaJ;EACE;IAAQ,2BAAA;;EACR;IAAQ,wBAAA;;;AAIV;EACE;IAAQ,2BAAA;;EACR;IAAQ,wBAAA;;;AASV;EACE,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,yBAAA;EACA,kBAAA;EzB0FA,sDAAA;EACQ,8CAAA;;AyBtFV;EACE,WAAA;EACA,SAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,kBAAA;EACA,yBAAA;EzB6EA,sDAAA;EACQ,8CAAA;EAKR,mCAAA;EACQ,2BAAA;;AyB9EV,iBAAkB;EzBqSd,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;EyBpSF,0BAAA;;AAIF,SAAS,OAAQ;EzBoJf,0DAAA;EACQ,kDAAA;;AyB5IV;EzBkiBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AyBnRJ;EzB8hBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AyB/QJ;EzB0hBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AyB3QJ;EzBshBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;A0B/UJ;AACA;EACE,gBAAA;EACA,OAAA;;AAIF;AACA,MAAO;EACL,gBAAA;;AAEF,MAAM;EACJ,aAAA;;AAIF;EACE,cAAA;;AAIF;EACE,eAAA;;AAOF,MACE;EACE,kBAAA;;AAFJ,MAIE;EACE,iBAAA;;AASJ;EACE,eAAA;EACA,gBAAA;;AC7CF;EAEE,mBAAA;EACA,eAAA;;AAQF;EACE,kBAAA;EACA,cAAA;EACA,kBAAA;EAEA,mBAAA;EACA,yBAAA;EACA,yBAAA;;AAGA,gBAAC;E3BqED,4BAAA;EACC,2BAAA;;A2BnED,gBAAC;EACC,gBAAA;E3ByEF,+BAAA;EACC,8BAAA;;A2BxFH,gBAmBE;EACE,YAAA;;AApBJ,gBAsBE,SAAS;EACP,iBAAA;;AAUJ,CAAC;EACC,cAAA;;AADF,CAAC,gBAGC;EACE,cAAA;;AAIF,CARD,gBAQE;AACD,CATD,gBASE;EACC,qBAAA;EACA,yBAAA;;AAIF,CAfD,gBAeE;AACD,CAhBD,gBAgBE,OAAO;AACR,CAjBD,gBAiBE,OAAO;EACN,UAAA;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AANF,CAfD,gBAeE,OASC;AARF,CAhBD,gBAgBE,OAAO,MAQN;AAPF,CAjBD,gBAiBE,OAAO,MAON;EACE,cAAA;;AAVJ,CAfD,gBAeE,OAYC;AAXF,CAhBD,gBAgBE,OAAO,MAWN;AAVF,CAjBD,gBAiBE,OAAO,MAUN;EACE,cAAA;;A3BoYJ,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,OAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,OASZ;AACD,CAND,iBAJc,OAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,OAcZ;AACD,CAXD,iBAJc,OAeZ,OAAO;AACR,CAZD,iBAJc,OAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,IAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,IASZ;AACD,CAND,iBAJc,IAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,IAcZ;AACD,CAXD,iBAJc,IAeZ,OAAO;AACR,CAZD,iBAJc,IAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,OAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,OASZ;AACD,CAND,iBAJc,OAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,OAcZ;AACD,CAXD,iBAJc,OAeZ,OAAO;AACR,CAZD,iBAJc,OAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,MAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,MASZ;AACD,CAND,iBAJc,MAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,MAcZ;AACD,CAXD,iBAJc,MAeZ,OAAO;AACR,CAZD,iBAJc,MAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;A2BlYR;EACE,aAAA;EACA,kBAAA;;AAEF;EACE,gBAAA;EACA,gBAAA;;ACtGF;EACE,mBAAA;EACA,yBAAA;EACA,6BAAA;EACA,kBAAA;E5B+GA,iDAAA;EACQ,yCAAA;;A4B3GV;EACE,aAAA;;AAKF;EACE,kBAAA;EACA,oCAAA;E5B4EA,4BAAA;EACC,2BAAA;;A4B/EH,cAKE,YAAY;EACV,cAAA;;AAKJ;EACE,aAAA;EACA,gBAAA;EACA,eAAA;EACA,cAAA;;AAJF,YAME;EACE,cAAA;;AAKJ;EACE,kBAAA;EACA,yBAAA;EACA,6BAAA;E5B4DA,+BAAA;EACC,8BAAA;;A4BnDH,MACE;EACE,gBAAA;;AAFJ,MACE,cAGE;EACE,mBAAA;EACA,gBAAA;;AAIF,MATF,cASG,YACC,iBAAgB;EACd,aAAA;E5B8BN,4BAAA;EACC,2BAAA;;A4B1BC,MAhBF,cAgBG,WACC,iBAAgB;EACd,gBAAA;E5B+BN,+BAAA;EACC,8BAAA;;A4BzBH,cAAe,cACb,iBAAgB;EACd,mBAAA;;AAUJ,MACE;AADF,MAEE,oBAAoB;EAClB,gBAAA;;AAHJ,MAME,SAAQ;AANV,MAOE,oBAAmB,YAAa,SAAQ;E5BHxC,4BAAA;EACC,2BAAA;;A4BLH,MAME,SAAQ,YAIN,QAAO,YAEL,KAAI,YACF,GAAE;AAbV,MAOE,oBAAmB,YAAa,SAAQ,YAGtC,QAAO,YAEL,KAAI,YACF,GAAE;AAbV,MAME,SAAQ,YAKN,QAAO,YACL,KAAI,YACF,GAAE;AAbV,MAOE,oBAAmB,YAAa,SAAQ,YAItC,QAAO,YACL,KAAI,YACF,GAAE;AAbV,MAME,SAAQ,YAIN,QAAO,YAEL,KAAI,YAEF,GAAE;AAdV,MAOE,oBAAmB,YAAa,SAAQ,YAGtC,QAAO,YAEL,KAAI,YAEF,GAAE;AAdV,MAME,SAAQ,YAKN,QAAO,YACL,KAAI,YAEF,GAAE;AAdV,MAOE,oBAAmB,YAAa,SAAQ,YAItC,QAAO,YACL,KAAI,YAEF,GAAE;EACA,2BAAA;;AAfV,MAME,SAAQ,YAIN,QAAO,YAEL,KAAI,YAKF,GAAE;AAjBV,MAOE,oBAAmB,YAAa,SAAQ,YAGtC,QAAO,YAEL,KAAI,YAKF,GAAE;AAjBV,MAME,SAAQ,YAKN,QAAO,YACL,KAAI,YAKF,GAAE;AAjBV,MAOE,oBAAmB,YAAa,SAAQ,YAItC,QAAO,YACL,KAAI,YAKF,GAAE;AAjBV,MAME,SAAQ,YAIN,QAAO,YAEL,KAAI,YAMF,GAAE;AAlBV,MAOE,oBAAmB,YAAa,SAAQ,YAGtC,QAAO,YAEL,KAAI,YAMF,GAAE;AAlBV,MAME,SAAQ,YAKN,QAAO,YACL,KAAI,YAMF,GAAE;AAlBV,MAOE,oBAAmB,YAAa,SAAQ,YAItC,QAAO,YACL,KAAI,YAMF,GAAE;EACA,4BAAA;;AAnBV,MAyBE,SAAQ;AAzBV,MA0BE,oBAAmB,WAAY,SAAQ;E5BdvC,+BAAA;EACC,8BAAA;;A4BbH,MAyBE,SAAQ,WAIN,QAAO,WAEL,KAAI,WACF,GAAE;AAhCV,MA0BE,oBAAmB,WAAY,SAAQ,WAGrC,QAAO,WAEL,KAAI,WACF,GAAE;AAhCV,MAyBE,SAAQ,WAKN,QAAO,WACL,KAAI,WACF,GAAE;AAhCV,MA0BE,oBAAmB,WAAY,SAAQ,WAIrC,QAAO,WACL,KAAI,WACF,GAAE;AAhCV,MAyBE,SAAQ,WAIN,QAAO,WAEL,KAAI,WAEF,GAAE;AAjCV,MA0BE,oBAAmB,WAAY,SAAQ,WAGrC,QAAO,WAEL,KAAI,WAEF,GAAE;AAjCV,MAyBE,SAAQ,WAKN,QAAO,WACL,KAAI,WAEF,GAAE;AAjCV,MA0BE,oBAAmB,WAAY,SAAQ,WAIrC,QAAO,WACL,KAAI,WAEF,GAAE;EACA,8BAAA;;AAlCV,MAyBE,SAAQ,WAIN,QAAO,WAEL,KAAI,WAKF,GAAE;AApCV,MA0BE,oBAAmB,WAAY,SAAQ,WAGrC,QAAO,WAEL,KAAI,WAKF,GAAE;AApCV,MAyBE,SAAQ,WAKN,QAAO,WACL,KAAI,WAKF,GAAE;AApCV,MA0BE,oBAAmB,WAAY,SAAQ,WAIrC,QAAO,WACL,KAAI,WAKF,GAAE;AApCV,MAyBE,SAAQ,WAIN,QAAO,WAEL,KAAI,WAMF,GAAE;AArCV,MA0BE,oBAAmB,WAAY,SAAQ,WAGrC,QAAO,WAEL,KAAI,WAMF,GAAE;AArCV,MAyBE,SAAQ,WAKN,QAAO,WACL,KAAI,WAMF,GAAE;AArCV,MA0BE,oBAAmB,WAAY,SAAQ,WAIrC,QAAO,WACL,KAAI,WAMF,GAAE;EACA,+BAAA;;AAtCV,MA2CE,cAAc;AA3ChB,MA4CE,cAAc;EACZ,6BAAA;;AA7CJ,MA+CE,SAAS,QAAO,YAAa,KAAI,YAAa;AA/ChD,MAgDE,SAAS,QAAO,YAAa,KAAI,YAAa;EAC5C,aAAA;;AAjDJ,MAmDE;AAnDF,MAoDE,oBAAoB;EAClB,SAAA;;AArDJ,MAmDE,kBAGE,QAGE,KACE,KAAI;AA1DZ,MAoDE,oBAAoB,kBAElB,QAGE,KACE,KAAI;AA1DZ,MAmDE,kBAIE,QAEE,KACE,KAAI;AA1DZ,MAoDE,oBAAoB,kBAGlB,QAEE,KACE,KAAI;AA1DZ,MAmDE,kBAKE,QACE,KACE,KAAI;AA1DZ,MAoDE,oBAAoB,kBAIlB,QACE,KACE,KAAI;AA1DZ,MAmDE,kBAGE,QAGE,KAEE,KAAI;AA3DZ,MAoDE,oBAAoB,kBAElB,QAGE,KAEE,KAAI;AA3DZ,MAmDE,kBAIE,QAEE,KAEE,KAAI;AA3DZ,MAoDE,oBAAoB,kBAGlB,QAEE,KAEE,KAAI;AA3DZ,MAmDE,kBAKE,QACE,KAEE,KAAI;AA3DZ,MAoDE,oBAAoB,kBAIlB,QACE,KAEE,KAAI;EACF,cAAA;;AA5DV,MAmDE,kBAGE,QAGE,KAKE,KAAI;AA9DZ,MAoDE,oBAAoB,kBAElB,QAGE,KAKE,KAAI;AA9DZ,MAmDE,kBAIE,QAEE,KAKE,KAAI;AA9DZ,MAoDE,oBAAoB,kBAGlB,QAEE,KAKE,KAAI;AA9DZ,MAmDE,kBAKE,QACE,KAKE,KAAI;AA9DZ,MAoDE,oBAAoB,kBAIlB,QACE,KAKE,KAAI;AA9DZ,MAmDE,kBAGE,QAGE,KAME,KAAI;AA/DZ,MAoDE,oBAAoB,kBAElB,QAGE,KAME,KAAI;AA/DZ,MAmDE,kBAIE,QAEE,KAME,KAAI;AA/DZ,MAoDE,oBAAoB,kBAGlB,QAEE,KAME,KAAI;AA/DZ,MAmDE,kBAKE,QACE,KAME,KAAI;AA/DZ,MAoDE,oBAAoB,kBAIlB,QACE,KAME,KAAI;EACF,eAAA;;AAhEV,MAmDE,kBAiBE,QAEE,KAAI,YACF;AAvER,MAoDE,oBAAoB,kBAgBlB,QAEE,KAAI,YACF;AAvER,MAmDE,kBAkBE,QACE,KAAI,YACF;AAvER,MAoDE,oBAAoB,kBAiBlB,QACE,KAAI,YACF;AAvER,MAmDE,kBAiBE,QAEE,KAAI,YAEF;AAxER,MAoDE,oBAAoB,kBAgBlB,QAEE,KAAI,YAEF;AAxER,MAmDE,kBAkBE,QACE,KAAI,YAEF;AAxER,MAoDE,oBAAoB,kBAiBlB,QACE,KAAI,YAEF;EACE,gBAAA;;AAzEV,MAmDE,kBA0BE,QAEE,KAAI,WACF;AAhFR,MAoDE,oBAAoB,kBAyBlB,QAEE,KAAI,WACF;AAhFR,MAmDE,kBA2BE,QACE,KAAI,WACF;AAhFR,MAoDE,oBAAoB,kBA0BlB,QACE,KAAI,WACF;AAhFR,MAmDE,kBA0BE,QAEE,KAAI,WAEF;AAjFR,MAoDE,oBAAoB,kBAyBlB,QAEE,KAAI,WAEF;AAjFR,MAmDE,kBA2BE,QACE,KAAI,WAEF;AAjFR,MAoDE,oBAAoB,kBA0BlB,QACE,KAAI,WAEF;EACE,gBAAA;;AAlFV,MAuFE;EACE,SAAA;EACA,gBAAA;;AAUJ;EACE,mBAAA;;AADF,YAIE;EACE,gBAAA;EACA,kBAAA;EACA,gBAAA;;AAPJ,YAIE,OAIE;EACE,eAAA;;AATN,YAaE;EACE,gBAAA;;AAdJ,YAaE,eAEE,kBAAkB;EAChB,6BAAA;;AAhBN,YAmBE;EACE,aAAA;;AApBJ,YAmBE,cAEE,kBAAkB;EAChB,gCAAA;;AAON;E5BsLE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4BhMN;E5BmLE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4B7LN;E5BgLE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4B1LN;E5B6KE,qBAAA;;AAEA,WAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,WAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,WAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4BvLN;E5B0KE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4BpLN;E5BuKE,qBAAA;;AAEA,aAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,aAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,aAAE,gBACA,kBAAkB;EAChB,4BAAA;;A6B5ZN;EACE,gBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;E7B6GA,uDAAA;EACQ,+CAAA;;A6BpHV,KAQE;EACE,kBAAA;EACA,iCAAA;;AAKJ;EACE,aAAA;EACA,kBAAA;;AAEF;EACE,YAAA;EACA,kBAAA;;ACtBF;EACE,YAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,4BAAA;E9BkRA,YAAA;EAGA,yBAAA;;A8BlRA,MAAC;AACD,MAAC;EACC,cAAA;EACA,qBAAA;EACA,eAAA;E9B2QF,YAAA;EAGA,yBAAA;;A8BvQA,MAAM;EACJ,UAAA;EACA,eAAA;EACA,uBAAA;EACA,SAAA;EACA,wBAAA;;ACpBJ;EACE,gBAAA;;AAIF;EACE,aAAA;EACA,cAAA;EACA,kBAAA;EACA,eAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,iCAAA;EAIA,UAAA;;AAGA,MAAC,KAAM;E/BiIP,mBAAmB,kBAAnB;EACI,eAAe,kBAAf;EACI,WAAW,kBAAX;EApBR,mDAAA;EACG,6CAAA;EACE,yCAAA;EACG,mCAAA;;A+B9GR,MAAC,GAAI;E/B6HL,mBAAmB,eAAnB;EACI,eAAe,eAAf;EACI,WAAW,eAAX;;A+B3HV;EACE,kBAAA;EACA,WAAA;EACA,YAAA;;AAIF;EACE,kBAAA;EACA,yBAAA;EACA,yBAAA;EACA,oCAAA;EACA,kBAAA;E/BqEA,gDAAA;EACQ,wCAAA;E+BpER,4BAAA;EAEA,aAAA;;AAIF;EACE,eAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,yBAAA;;AAEA,eAAC;E/BwND,UAAA;EAGA,wBAAA;;A+B1NA,eAAC;E/BuND,YAAA;EAGA,yBAAA;;A+BrNF;EACE,aAAA;EACA,gCAAA;EACA,yBAAA;;AAGF,aAAc;EACZ,gBAAA;;AAIF;EACE,SAAA;EACA,uBAAA;;AAKF;EACE,kBAAA;EACA,aAAA;;AAIF;EACE,gBAAA;EACA,uBAAA;EACA,iBAAA;EACA,6BAAA;;AAJF,aAQE,KAAK;EACH,gBAAA;EACA,gBAAA;;AAVJ,aAaE,WAAW,KAAK;EACd,iBAAA;;AAdJ,aAiBE,WAAW;EACT,cAAA;;AAmBJ,QAdmC;EAEjC;IACE,YAAA;IACA,iBAAA;;EAEF;I/BPA,iDAAA;IACQ,yCAAA;;E+BWR;IAAY,YAAA;;;AAMd,QAHmC;EACjC;IAAY,YAAA;;;ACnId;EACE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;EhCiRA,UAAA;EAGA,wBAAA;;AgCjRA,QAAC;EhC8QD,YAAA;EAGA,yBAAA;;AgChRA,QAAC;EAAU,gBAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,gBAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,eAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,iBAAA;EAAmB,cAAA;;AAIhC;EACE,gBAAA;EACA,gBAAA;EACA,cAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;;AAIF;EACE,kBAAA;EACA,QAAA;EACA,SAAA;EACA,yBAAA;EACA,mBAAA;;AAGA,QAAC,IAAK;EACJ,SAAA;EACA,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,SAAU;EACT,SAAA;EACA,SAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,UAAW;EACV,SAAA;EACA,UAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,MAAO;EACN,QAAA;EACA,OAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;;AAEF,QAAC,KAAM;EACL,QAAA;EACA,QAAA;EACA,gBAAA;EACA,2BAAA;EACA,0BAAA;;AAEF,QAAC,OAAQ;EACP,MAAA;EACA,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,4BAAA;;AAEF,QAAC,YAAa;EACZ,MAAA;EACA,SAAA;EACA,uBAAA;EACA,4BAAA;;AAEF,QAAC,aAAc;EACb,MAAA;EACA,UAAA;EACA,uBAAA;EACA,4BAAA;;ACvFJ;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;EACA,gBAAA;EACA,YAAA;EACA,gBAAA;EACA,yBAAA;EACA,4BAAA;EACA,yBAAA;EACA,oCAAA;EACA,kBAAA;EjCuGA,iDAAA;EACQ,yCAAA;EiCpGR,mBAAA;;AAGA,QAAC;EAAW,iBAAA;;AACZ,QAAC;EAAW,iBAAA;;AACZ,QAAC;EAAW,gBAAA;;AACZ,QAAC;EAAW,kBAAA;;AAGd;EACE,SAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gCAAA;EACA,0BAAA;;AAGF;EACE,iBAAA;;AAQA,QADO;AAEP,QAFO,SAEN;EACC,kBAAA;EACA,cAAA;EACA,QAAA;EACA,SAAA;EACA,yBAAA;EACA,mBAAA;;AAGJ,QAAS;EACP,kBAAA;;AAEF,QAAS,SAAQ;EACf,kBAAA;EACA,SAAS,EAAT;;AAIA,QAAC,IAAK;EACJ,SAAA;EACA,kBAAA;EACA,sBAAA;EACA,yBAAA;EACA,qCAAA;EACA,aAAA;;AACA,QAPD,IAAK,SAOH;EACC,SAAS,GAAT;EACA,WAAA;EACA,kBAAA;EACA,sBAAA;EACA,yBAAA;;AAGJ,QAAC,MAAO;EACN,QAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA;EACA,2BAAA;EACA,uCAAA;;AACA,QAPD,MAAO,SAOL;EACC,SAAS,GAAT;EACA,SAAA;EACA,aAAA;EACA,oBAAA;EACA,2BAAA;;AAGJ,QAAC,OAAQ;EACP,SAAA;EACA,kBAAA;EACA,mBAAA;EACA,4BAAA;EACA,wCAAA;EACA,UAAA;;AACA,QAPD,OAAQ,SAON;EACC,SAAS,GAAT;EACA,QAAA;EACA,kBAAA;EACA,mBAAA;EACA,4BAAA;;AAIJ,QAAC,KAAM;EACL,QAAA;EACA,YAAA;EACA,iBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sCAAA;;AACA,QAPD,KAAM,SAOJ;EACC,SAAS,GAAT;EACA,UAAA;EACA,qBAAA;EACA,0BAAA;EACA,aAAA;;A9B1HN;EACE,kBAAA;;AAGF;EACE,kBAAA;EACA,gBAAA;EACA,WAAA;;AAHF,eAKE;EACE,aAAA;EACA,kBAAA;EH8GF,yCAAA;EACQ,iCAAA;;AGtHV,eAKE,QAME;AAXJ,eAKE,QAOE,IAAI;EAEF,cAAA;;AAdN,eAkBE;AAlBF,eAmBE;AAnBF,eAoBE;EAAU,cAAA;;AApBZ,eAsBE;EACE,OAAA;;AAvBJ,eA0BE;AA1BF,eA2BE;EACE,kBAAA;EACA,MAAA;EACA,WAAA;;AA9BJ,eAiCE;EACE,UAAA;;AAlCJ,eAoCE;EACE,WAAA;;AArCJ,eAuCE,QAAO;AAvCT,eAwCE,QAAO;EACL,OAAA;;AAzCJ,eA4CE,UAAS;EACP,WAAA;;AA7CJ,eA+CE,UAAS;EACP,UAAA;;AAQJ;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EHsNA,YAAA;EAGA,yBAAA;EGvNA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,yCAAA;;AAKA,iBAAC;EH8NC,kBAAkB,8BAA8B,mCAAyC,uCAAzF;EACA,kBAAmB,4EAAnB;EACA,2BAAA;EACA,sHAAA;;AG9NF,iBAAC;EACC,UAAA;EACA,QAAA;EHyNA,kBAAkB,8BAA8B,sCAAyC,oCAAzF;EACA,kBAAmB,4EAAnB;EACA,2BAAA;EACA,sHAAA;;AGvNF,iBAAC;AACD,iBAAC;EACC,aAAA;EACA,cAAA;EACA,qBAAA;EH8LF,YAAA;EAGA,yBAAA;;AG9NF,iBAkCE;AAlCF,iBAmCE;AAnCF,iBAoCE;AApCF,iBAqCE;EACE,kBAAA;EACA,QAAA;EACA,UAAA;EACA,qBAAA;;AAzCJ,iBA2CE;AA3CF,iBA4CE;EACE,SAAA;;AA7CJ,iBA+CE;AA/CF,iBAgDE;EACE,UAAA;;AAjDJ,iBAmDE;AAnDF,iBAoDE;EACE,WAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;;AAIA,iBADF,WACG;EACC,SAAS,OAAT;;AAIF,iBADF,WACG;EACC,SAAS,OAAT;;AAUN;EACE,kBAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;EACA,UAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AATF,oBAWE;EACE,qBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,mBAAA;EACA,eAAA;EAUA,yBAAA;EACA,kCAAA;;AA9BJ,oBAgCE;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,yBAAA;;AAOJ;EACE,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA;EACA,cAAA;EACA,kBAAA;EACA,yCAAA;;AACA,iBAAE;EACA,iBAAA;;AAkCJ,mBA5B8C;EAG5C,iBACE;EADF,iBAEE;EAFF,iBAGE;EAHF,iBAIE;IACE,WAAA;IACA,YAAA;IACA,iBAAA;IACA,kBAAA;IACA,eAAA;;EAKJ;IACE,SAAA;IACA,UAAA;IACA,oBAAA;;EAIF;IACE,YAAA;;;AHlNF,SAAC;AACD,SAAC;AMXH,UNUG;AMVH,UNWG;AMSH,gBNVG;AMUH,gBNTG;AMkBH,INnBG;AMmBH,INlBG;AQsXH,gBAoBE,YR3YC;AQuXH,gBAoBE,YR1YC;AUkBH,YVnBG;AUmBH,YVlBG;AU8HH,mBAWE,aV1IC;AU+HH,mBAWE,aVzIC;AeZH,IfWG;AeXH,IfYG;AgBVH,OhBSG;AgBTH,OhBUG;AgBUH,chBXG;AgBWH,chBVG;AgB6BH,gBhB9BG;AgB8BH,gBhB7BG;AoBfH,MpBcG;AoBdH,MpBeG;A4BLH,W5BIG;A4BJH,W5BKG;A+B+EH,a/BhFG;A+BgFH,a/B/EG;EACC,SAAS,GAAT;EACA,cAAA;;AAEF,SAAC;AMfH,UNeG;AMKH,gBNLG;AMcH,INdG;AQkXH,gBAoBE,YRtYC;AUcH,YVdG;AU0HH,mBAWE,aVrIC;AehBH,IfgBG;AgBdH,OhBcG;AgBMH,chBNG;AgByBH,gBhBzBG;AoBnBH,MpBmBG;A4BTH,W5BSG;A+B2EH,a/B3EG;EACC,WAAA;;AiBdJ;EjB6BE,cAAA;EACA,iBAAA;EACA,kBAAA;;AiB5BF;EACE,uBAAA;;AAEF;EACE,sBAAA;;AAQF;EACE,wBAAA;;AAEF;EACE,yBAAA;;AAEF;EACE,kBAAA;;AAEF;EjB8CE,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,6BAAA;EACA,SAAA;;AiBzCF;EACE,wBAAA;EACA,6BAAA;;AAOF;EACE,eAAA;;AiBnCF;EACE,mBAAA;;AAKF;AACA;AACA;AACA;ElCylBE,wBAAA;;AkCjlBF,QAHqC;EAGrC;IlCykBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCxkBZ,QAHqC,uBAAgC;EAGrE;IlCokBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCnkBZ,QAHqC,uBAAgC;EAGrE;IlC+jBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkC9jBZ,QAHqC;EAGrC;IlC0jBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCxjBZ,QAHqC;EAGrC;IlC4jBE,wBAAA;;;AkCvjBF,QAHqC,uBAAgC;EAGrE;IlCujBE,wBAAA;;;AkCljBF,QAHqC,uBAAgC;EAGrE;IlCkjBE,wBAAA;;;AkC7iBF,QAHqC;EAGrC;IlC6iBE,wBAAA;;;AkCtiBF;ElCsiBE,wBAAA;;AkChiBF;EAAA;IlCwhBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCthBZ;EAAA;IlC0hBE,wBAAA","sourcesContent":["/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined in IE 8/9.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9.\n// Hide the `template` element in IE, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9, Safari 5, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari 5 and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari 5, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow displayed oddly in IE 9.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari 5.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8+, and Opera\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 62.5%;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg: #fff;\n//** Global text color on `<body>`.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base: @font-family-sans-serif;\n\n@font-size-base: 14px;\n@font-size-large: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small: ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1: floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2: floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5: @font-size-base;\n@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base: 1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family: inherit;\n@headings-font-weight: 500;\n@headings-line-height: 1.1;\n@headings-color: inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path: \"../fonts/\";\n@icon-font-name: \"glyphicons-halflings-regular\";\n@icon-font-svg-id: \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical: 6px;\n@padding-base-horizontal: 12px;\n\n@padding-large-vertical: 10px;\n@padding-large-horizontal: 16px;\n\n@padding-small-vertical: 5px;\n@padding-small-horizontal: 10px;\n\n@padding-xs-vertical: 1px;\n@padding-xs-horizontal: 5px;\n\n@line-height-large: 1.33;\n@line-height-small: 1.5;\n\n@border-radius-base: 4px;\n@border-radius-large: 6px;\n@border-radius-small: 3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color: #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg: @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base: 4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large: 5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding: 8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding: 5px;\n\n//** Default background color used for all tables.\n@table-bg: transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent: #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover: #f5f5f5;\n@table-bg-active: @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color: #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight: normal;\n\n@btn-default-color: #333;\n@btn-default-bg: #fff;\n@btn-default-border: #ccc;\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @brand-primary;\n@btn-primary-border: darken(@btn-primary-bg, 5%);\n\n@btn-success-color: #fff;\n@btn-success-bg: @brand-success;\n@btn-success-border: darken(@btn-success-bg, 5%);\n\n@btn-info-color: #fff;\n@btn-info-bg: @brand-info;\n@btn-info-border: darken(@btn-info-bg, 5%);\n\n@btn-warning-color: #fff;\n@btn-warning-bg: @brand-warning;\n@btn-warning-border: darken(@btn-warning-bg, 5%);\n\n@btn-danger-color: #fff;\n@btn-danger-bg: @brand-danger;\n@btn-danger-border: darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color: @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg: #fff;\n//** `<input disabled>` background color\n@input-bg-disabled: @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color: @gray;\n//** `<input>` border color\n@input-border: #ccc;\n//** `<input>` border radius\n@input-border-radius: @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus: #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder: @gray-light;\n\n//** Default `.form-control` height\n@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color: @gray-dark;\n@legend-border-color: #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg: @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg: #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border: rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border: #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg: #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color: @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color: darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg: #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color: @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg: @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color: @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color: @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color: #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar: 1000;\n@zindex-dropdown: 1000;\n@zindex-popover: 1010;\n@zindex-tooltip: 1030;\n@zindex-navbar-fixed: 1030;\n@zindex-modal-background: 1040;\n@zindex-modal: 1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs: 480px;\n@screen-xs-min: @screen-xs;\n@screen-phone: @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm: 768px;\n@screen-sm-min: @screen-sm;\n@screen-tablet: @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md: 992px;\n@screen-md-min: @screen-md;\n@screen-desktop: @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg: 1200px;\n@screen-lg-min: @screen-lg;\n@screen-lg-desktop: @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max: (@screen-sm-min - 1);\n@screen-sm-max: (@screen-md-min - 1);\n@screen-md-max: (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns: 12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width: 30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint: @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet: ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm: @container-tablet;\n\n// Medium screen / desktop\n@container-desktop: ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md: @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop: ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg: @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height: 50px;\n@navbar-margin-bottom: @line-height-computed;\n@navbar-border-radius: @border-radius-base;\n@navbar-padding-horizontal: floor((@grid-gutter-width / 2));\n@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height: 340px;\n\n@navbar-default-color: #777;\n@navbar-default-bg: #f8f8f8;\n@navbar-default-border: darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color: #777;\n@navbar-default-link-hover-color: #333;\n@navbar-default-link-hover-bg: transparent;\n@navbar-default-link-active-color: #555;\n@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color: #ccc;\n@navbar-default-link-disabled-bg: transparent;\n\n// Navbar brand label\n@navbar-default-brand-color: @navbar-default-link-color;\n@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg: transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg: #ddd;\n@navbar-default-toggle-icon-bar-bg: #888;\n@navbar-default-toggle-border-color: #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color: @gray-light;\n@navbar-inverse-bg: #222;\n@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color: @gray-light;\n@navbar-inverse-link-hover-color: #fff;\n@navbar-inverse-link-hover-bg: transparent;\n@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color: #444;\n@navbar-inverse-link-disabled-bg: transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color: @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color: #fff;\n@navbar-inverse-brand-hover-bg: transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg: #333;\n@navbar-inverse-toggle-icon-bar-bg: #fff;\n@navbar-inverse-toggle-border-color: #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding: 10px 15px;\n@nav-link-hover-bg: @gray-lighter;\n\n@nav-disabled-link-color: @gray-light;\n@nav-disabled-link-hover-color: @gray-light;\n\n@nav-open-link-hover-color: #fff;\n\n//== Tabs\n@nav-tabs-border-color: #ddd;\n\n@nav-tabs-link-hover-border-color: @gray-lighter;\n\n@nav-tabs-active-link-hover-bg: @body-bg;\n@nav-tabs-active-link-hover-color: @gray;\n@nav-tabs-active-link-hover-border-color: #ddd;\n\n@nav-tabs-justified-link-border-color: #ddd;\n@nav-tabs-justified-active-link-border-color: @body-bg;\n\n//== Pills\n@nav-pills-border-radius: @border-radius-base;\n@nav-pills-active-link-hover-bg: @component-active-bg;\n@nav-pills-active-link-hover-color: @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color: @link-color;\n@pagination-bg: #fff;\n@pagination-border: #ddd;\n\n@pagination-hover-color: @link-hover-color;\n@pagination-hover-bg: @gray-lighter;\n@pagination-hover-border: #ddd;\n\n@pagination-active-color: #fff;\n@pagination-active-bg: @brand-primary;\n@pagination-active-border: @brand-primary;\n\n@pagination-disabled-color: @gray-light;\n@pagination-disabled-bg: #fff;\n@pagination-disabled-border: #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg: @pagination-bg;\n@pager-border: @pagination-border;\n@pager-border-radius: 15px;\n\n@pager-hover-bg: @pagination-hover-bg;\n\n@pager-active-bg: @pagination-active-bg;\n@pager-active-color: @pagination-active-color;\n\n@pager-disabled-color: @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding: 30px;\n@jumbotron-color: inherit;\n@jumbotron-bg: @gray-lighter;\n@jumbotron-heading-color: inherit;\n@jumbotron-font-size: ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text: #3c763d;\n@state-success-bg: #dff0d8;\n@state-success-border: darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text: #31708f;\n@state-info-bg: #d9edf7;\n@state-info-border: darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text: #8a6d3b;\n@state-warning-bg: #fcf8e3;\n@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text: #a94442;\n@state-danger-bg: #f2dede;\n@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width: 200px;\n//** Tooltip text color\n@tooltip-color: #fff;\n//** Tooltip background color\n@tooltip-bg: #000;\n@tooltip-opacity: .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width: 5px;\n//** Tooltip arrow color\n@tooltip-arrow-color: @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg: #fff;\n//** Popover maximum width\n@popover-max-width: 276px;\n//** Popover border color\n@popover-border-color: rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color: #ccc;\n\n//** Popover title background color\n@popover-title-bg: darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width: 10px;\n//** Popover arrow color\n@popover-arrow-color: #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width: (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color: fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg: @gray-light;\n//** Primary label background color\n@label-primary-bg: @brand-primary;\n//** Success label background color\n@label-success-bg: @brand-success;\n//** Info label background color\n@label-info-bg: @brand-info;\n//** Warning label background color\n@label-warning-bg: @brand-warning;\n//** Danger label background color\n@label-danger-bg: @brand-danger;\n\n//** Default label text color\n@label-color: #fff;\n//** Default text color of a linked label\n@label-link-hover-color: #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding: 20px;\n\n//** Padding applied to the modal title\n@modal-title-padding: 15px;\n//** Modal title line-height\n@modal-title-line-height: @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg: #fff;\n//** Modal content border color\n@modal-content-border-color: rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color: #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg: #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity: .5;\n//** Modal header border color\n@modal-header-border-color: #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color: @modal-header-border-color;\n\n@modal-lg: 900px;\n@modal-md: 600px;\n@modal-sm: 300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding: 15px;\n@alert-border-radius: @border-radius-base;\n@alert-link-font-weight: bold;\n\n@alert-success-bg: @state-success-bg;\n@alert-success-text: @state-success-text;\n@alert-success-border: @state-success-border;\n\n@alert-info-bg: @state-info-bg;\n@alert-info-text: @state-info-text;\n@alert-info-border: @state-info-border;\n\n@alert-warning-bg: @state-warning-bg;\n@alert-warning-text: @state-warning-text;\n@alert-warning-border: @state-warning-border;\n\n@alert-danger-bg: @state-danger-bg;\n@alert-danger-text: @state-danger-text;\n@alert-danger-border: @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg: #f5f5f5;\n//** Progress bar text color\n@progress-bar-color: #fff;\n\n//** Default progress bar color\n@progress-bar-bg: @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg: @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg: @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg: @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg: @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg: #fff;\n//** `.list-group-item` border color\n@list-group-border: #ddd;\n//** List group border radius\n@list-group-border-radius: @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg: #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color: @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg: @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border: @list-group-active-bg;\n@list-group-active-text-color: lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color: #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg: #fff;\n@panel-body-padding: 15px;\n@panel-border-radius: @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border: #ddd;\n@panel-footer-bg: #f5f5f5;\n\n@panel-default-text: @gray-dark;\n@panel-default-border: #ddd;\n@panel-default-heading-bg: #f5f5f5;\n\n@panel-primary-text: #fff;\n@panel-primary-border: @brand-primary;\n@panel-primary-heading-bg: @brand-primary;\n\n@panel-success-text: @state-success-text;\n@panel-success-border: @state-success-border;\n@panel-success-heading-bg: @state-success-bg;\n\n@panel-info-text: @state-info-text;\n@panel-info-border: @state-info-border;\n@panel-info-heading-bg: @state-info-bg;\n\n@panel-warning-text: @state-warning-text;\n@panel-warning-border: @state-warning-border;\n@panel-warning-heading-bg: @state-warning-bg;\n\n@panel-danger-text: @state-danger-text;\n@panel-danger-border: @state-danger-border;\n@panel-danger-heading-bg: @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding: 4px;\n//** Thumbnail background color\n@thumbnail-bg: @body-bg;\n//** Thumbnail border color\n@thumbnail-border: #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius: @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color: @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding: 9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg: #f5f5f5;\n@well-border: darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color: #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color: #fff;\n@badge-bg: @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color: @link-color;\n//** Badge background color in active nav link\n@badge-active-bg: #fff;\n\n@badge-font-weight: bold;\n@badge-line-height: 1;\n@badge-border-radius: 10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical: 8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg: #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color: #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color: @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator: \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color: #fff;\n@carousel-control-width: 15%;\n@carousel-control-opacity: .5;\n@carousel-control-font-size: 20px;\n\n@carousel-indicator-active-bg: #fff;\n@carousel-indicator-border-color: #fff;\n\n@carousel-caption-color: #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight: bold;\n@close-color: #000;\n@close-text-shadow: 0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color: #c7254e;\n@code-bg: #f9f2f4;\n\n@kbd-color: #fff;\n@kbd-bg: #333;\n\n@pre-bg: #f5f5f5;\n@pre-color: @gray-dark;\n@pre-border-color: #ccc;\n@pre-scrollable-max-height: 340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted: @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color: @gray-light;\n//** Headings small color\n@headings-small-color: @gray-light;\n//** Blockquote small color\n@blockquote-small-color: @gray-light;\n//** Blockquote font size\n@blockquote-font-size: (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color: @gray-lighter;\n//** Page header border color\n@page-header-border-color: @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border: @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev { display: block; }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: none;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n margin-left: -10px;\n font-family: serif;\n }\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n font-size: 30px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 200;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small { font-size: 85%; }\n\n// Undo browser default styling\ncite { font-style: normal; }\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n .dl-horizontal {\n dt {\n float: left;\n width: (@component-offset-horizontal - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @component-offset-horizontal;\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n white-space: nowrap;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n max-width: 100%;\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n .table-responsive {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: scroll;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; /* IE8-9 */\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n padding-left: 20px;\n label {\n display: inline;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n float: left;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n\n // Feedback icon (requires .glyphicon classes)\n .form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n }\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n vertical-align: middle;\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n float: none;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of labels, radios, and checkboxes\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n .form-control-static {\n padding-top: (@padding-base-vertical + 1);\n }\n\n // Only right align form labels here when the columns stop stacking\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n padding-left: 0;\n padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: none;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n display: none;\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n &.in {\n display: block;\n }\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n max-height: @navbar-collapse-max-height;\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: none;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n &[href] {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n}\n\n// Hover state, but only for links\na.badge {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.min.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 679272d25859d55e9931101ef56656e2c50e5ea5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.eot b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.svg b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc739dd851f2d7d291be032e30b909e3e95f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph /> -<glyph /> -<glyph unicode="
" /> -<glyph unicode=" " /> -<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> -<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> -<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> -<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> -<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> -<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> -<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> -<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> -<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> -<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> -<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> -<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> -<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> -<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> -<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> -<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> -<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> -<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> -<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> -<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> -<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> -<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> -<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> -<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> -<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> -<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> -<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> -<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> -<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> -<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> -<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> -<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> -<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> -<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> -<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> -<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> -<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> -<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> -<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> -<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> -<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> -<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> -<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> -<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> -<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> -<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> -<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> -<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> -<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> -<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> -<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> -<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> -<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> -<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> -<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> -<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> -<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> -<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> -<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> -<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> -<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> -<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> -<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> -<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> -<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> -<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> -<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> -<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> -<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> -<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> -<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> -<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> -<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> -<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> -<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> -<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> -<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> -<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> -<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> -<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> -<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> -<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> -<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> -<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> -<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> -<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> -<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> -<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> -<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> -<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> -<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> -<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> -<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> -<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> -<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> -<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> -<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> -<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> -<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> -<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> -<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> -<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> -<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> -<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> -<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> -<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> -<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> -<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> -<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> -<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.woff b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.js deleted file mode 100644 index 8ae571b6da5be9c7dcd95ba25896ae39e1917445..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,1951 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.1.1 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd', - 'MozTransition' : 'transitionend', - 'OTransition' : 'oTransitionEnd otransitionend', - 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.1.1 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.1.1 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.1.1 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return this.sliding = false - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.1.1 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.1.1 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) - - $this.focus() - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - var desc = ' li:not(.divider):visible a' - var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc) - - if (!$items.length) return - - var index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).focus() - } - - function clearMenus(e) { - $(backdrop).remove() - $(toggle).each(function () { - var $parent = getParent($(this)) - var relatedTarget = { relatedTarget: this } - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.1.1 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - this.$backdrop = - this.isShown = null - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this[!this.isShown ? 'show' : 'hide'](_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$element.find('.modal-dialog') // wait for modal to slide in - .one($.support.transition.end, function () { - that.$element.focus().trigger(e) - }) - .emulateTransitionEnd(300) : - that.$element.focus().trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - .off('click.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one($.support.transition.end, $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.focus() - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (callback) { - callback() - } - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - var old = $.fn.modal - - $.fn.modal = function (option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target - .modal(option, this) - .one('hide', function () { - $this.is(':visible') && $this.focus() - }) - }) - - $(document) - .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') }) - .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.1.1 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = - this.options = - this.enabled = - this.timeout = - this.hoverState = - this.$element = null - - this.init('tooltip', element, options) - } - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - var that = this; - - var $tip = this.tip() - - this.setContent() - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var $parent = this.$element.parent() - - var orgPlacement = placement - var docScroll = document.documentElement.scrollTop || document.body.scrollTop - var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth() - var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight() - var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left - - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' : - placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' : - placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - this.hoverState = null - - var complete = function() { - that.$element.trigger('shown.bs.' + that.type) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one($.support.transition.end, complete) - .emulateTransitionEnd(150) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var replace - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top = offset.top + marginTop - offset.left = offset.left + marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - replace = true - offset.top = offset.top + height - actualHeight - } - - if (/bottom|top/.test(placement)) { - var delta = 0 - - if (offset.left < 0) { - delta = offset.left * -2 - offset.left = 0 - - $tip.offset(offset) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function () { - var that = this - var $tip = this.tip() - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element.trigger('hidden.bs.' + that.type) - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one($.support.transition.end, complete) - .emulateTransitionEnd(150) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth, - height: el.offsetHeight - }, this.$element.offset()) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.tip = function () { - return this.$tip = this.$tip || $(this.options.template) - } - - Tooltip.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') - } - - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - - Tooltip.prototype.destroy = function () { - clearTimeout(this.timeout) - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - var old = $.fn.tooltip - - $.fn.tooltip = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.1.1 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content')[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.arrow') - } - - Popover.prototype.tip = function () { - if (!this.$tip) this.$tip = $(this.options.template) - return this.$tip - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - var old = $.fn.popover - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.1.1 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - var href - var process = $.proxy(this.process, this) - - this.$element = $(element).is('body') ? $(window) : $(element) - this.$body = $('body') - this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.offsets = $([]) - this.targets = $([]) - this.activeTarget = null - - this.refresh() - this.process() - } - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.refresh = function () { - var offsetMethod = this.$element[0] == window ? 'offset' : 'position' - - this.offsets = $([]) - this.targets = $([]) - - var self = this - var $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - var maxScroll = scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) && this.activate(i) - } - - if (activeTarget && scrollTop <= offsets[0]) { - return activeTarget != (i = targets[0]) && this.activate(i) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.1.1 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - this.element = $(element) - } - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: previous - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active - .one($.support.transition.end, next) - .emulateTransitionEnd(150) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - var old = $.fn.tab - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.1.1 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - this.$window = $(window) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0 - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$window.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$window.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (this.affixed == 'top') position.top += scrollTop - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) - - if (affix == 'bottom') { - this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - $spy.affix(data) - }) - }) - -}(jQuery); diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.min.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.min.js deleted file mode 100644 index b04a0e82fffee109e8cd5e48b3f3aa2a9b2aceff..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css deleted file mode 100644 index d0a7cd74544aa8c19276818f7c03f4295b269a1b..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css +++ /dev/null @@ -1,1657 +0,0 @@ -/*! - * Fuel UX v3.0.2 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ - -.fuelux { - -}@charset "UTF-8"; -.fuelux .clearfix { - *zoom: 1; -} -.fuelux .clearfix:before, -.fuelux .clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .clearfix:after { - clear: both; -} -@font-face { - font-family: "fuelux"; - src: url("../fonts/fuelux.eot"); - src: url("../fonts/fuelux.eot?#iefix") format("embedded-opentype"), url("../fonts/fuelux.woff") format("woff"), url("../fonts/fuelux.ttf") format("truetype"), url("../fonts/fuelux.svg#fuelux") format("svg"); - font-weight: normal; - font-style: normal; -} -.fuelux [class^="fueluxicon-"]:before, -.fuelux [class*=" fueluxicon-"]:before { - font-family: "fuelux" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - line-height: 1; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.fuelux .fueluxicon-loader-full:before { - content: "\e000"; -} -.fuelux .fueluxicon-loader-1:before { - content: "\e001"; -} -.fuelux .fueluxicon-loader-2:before { - content: "\e002"; -} -.fuelux .fueluxicon-loader-3:before { - content: "\e003"; -} -.fuelux .fueluxicon-loader-4:before { - content: "\e004"; -} -.fuelux .fueluxicon-loader-5:before { - content: "\e005"; -} -.fuelux .fueluxicon-loader-6:before { - content: "\e006"; -} -.fuelux .fueluxicon-loader-7:before { - content: "\e007"; -} -.fuelux .fueluxicon-loader-8:before { - content: "\e008"; -} -.fuelux .fueluxicon-bullet:before { - content: "\e009"; -} -.fuelux .checkbox { - /* for keyboard tabbing */ -} -.fuelux .checkbox.highlight { - padding: 4px; -} -.fuelux .checkbox.highlight.checked { - background: #e9e9e9; - border-radius: 4px; -} -.fuelux .checkbox input[type="checkbox"]:focus + .checkbox-label, -.fuelux .checkbox input[type="checkbox"]:hover + .checkbox-label, -.fuelux .checkbox .checkbox-label:hover { - color: #999999; -} -.fuelux .checkbox-custom { - position: relative; - /* for keyboard tabbing */ -} -.fuelux .checkbox-custom:before { - font-family: "Glyphicons Halflings" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - line-height: 1; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - border: 1px solid #adadad; - border-radius: 4px; - color: #fff; - content: " "; - font-size: 9px; - height: 14px; - left: 0px; - padding: 1px 0 0 1px; - position: absolute; - top: 3px; - width: 14px; -} -.fuelux .checkbox-custom.checked:before { - background: #39b3d7; - border-color: #39b3d7; - content: "\e013"; -} -.fuelux .checkbox-custom.disabled { - cursor: not-allowed; -} -.fuelux .checkbox-custom.disabled:before { - cursor: not-allowed; - opacity: .5; -} -.fuelux .checkbox-custom.checkbox-inline:before { - left: 0; - top: 3px; -} -.fuelux .checkbox-custom.checkbox-inline.highlight { - padding: 4px 4px 4px 24px; -} -.fuelux .checkbox-custom.checkbox-inline.highlight:before { - left: 4px; - top: 7px; -} -.fuelux .checkbox-custom.checkbox-inline.highlight.checked { - background: #e9e9e9; - border-radius: 4px; -} -.fuelux .checkbox-custom input[type="checkbox"]:focus + .checkbox-label { - color: #999999; -} -.fuelux .combobox.disabled .input-group-btn { - cursor: not-allowed; -} -.fuelux .datepicker-calendar { - padding: 16px 16px 0; - min-height: 262px; -} -.fuelux .datepicker-calendar button { - border: 0; - padding: 0; - background-color: transparent; -} -.fuelux .datepicker-calendar-days { - height: 182px; - margin: 10px 0 12px; - width: 100%; - /* for spacing */ -} -.fuelux .datepicker-calendar-days thead { - border-bottom: 1px solid #cccaca; -} -.fuelux .datepicker-calendar-days tbody:before { - line-height: 3px; - content: "\200C"; - display: block; -} -.fuelux .datepicker-calendar-days td, -.fuelux .datepicker-calendar-days th { - font-size: 14px; - height: 32px; - text-align: center; - vertical-align: middle; - width: 14.29%; -} -.fuelux .datepicker-calendar-days td button { - color: #231f20; - display: inline-block; - height: 30px; - text-decoration: none; - width: 30px; -} -.fuelux .datepicker-calendar-days td span { - display: block; -} -.fuelux .datepicker-calendar-days td span:hover { - background: #b7e3f8; - text-decoration: none; -} -.fuelux .datepicker-calendar-days td.current-day button { - border: 1px solid #1d75bb; -} -.fuelux .datepicker-calendar-days td.last-month, -.fuelux .datepicker-calendar-days td.next-month { - background: #e3e2e1; -} -.fuelux .datepicker-calendar-days td.past button { - color: #8d8787; -} -.fuelux .datepicker-calendar-days td.restricted button { - cursor: no-drop; - position: relative; -} -.fuelux .datepicker-calendar-days td.restricted button:before { - border-top: 1px solid #a94442; - bottom: 0; - content: " "; - display: block; - left: 5px; - position: absolute; - right: 5px; - top: 50%; -} -.fuelux .datepicker-calendar-days td.restricted button:hover { - background: none; -} -.fuelux .datepicker-calendar-days td.selected span { - background: #1d75bb; -} -.fuelux .datepicker-calendar-days td.selected span:hover { - background: #0f5f9f; -} -.fuelux .datepicker-calendar-days td.selected button { - color: #fff; -} -.fuelux .datepicker-calendar-days td.selected.current-day { - box-shadow: 0 0 0 1px #fff offset; -} -.fuelux .datepicker-calendar-days th { - font-weight: bold; - height: 22px; - vertical-align: top; -} -.fuelux .datepicker-calendar-header { - *zoom: 1; -} -.fuelux .datepicker-calendar-header:before, -.fuelux .datepicker-calendar-header:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .datepicker-calendar-header:after { - clear: both; -} -.fuelux .datepicker-calendar-header button { - border: 0; - padding: 0; - background-color: transparent; -} -.fuelux .datepicker-calendar-header .title { - margin: 0 auto; - text-align: center; - display: block; - width: 174px; - color: #4d4d4f; - font-size: 20px; - line-height: 30px; - text-decoration: underline; - vertical-align: middle; -} -.fuelux .datepicker-calendar-header .title:hover { - color: #1d75bb; - text-decoration: underline; -} -.fuelux .datepicker-calendar-header .title.disabled { - cursor: default; - pointer-events: none; - text-decoration: none; -} -.fuelux .datepicker-calendar-header .title .month { - display: inline; - margin: 0; - padding: 0; -} -.fuelux .datepicker-calendar-header .title .month span { - display: none; -} -.fuelux .datepicker-calendar-header .title .month span.current { - display: inline; -} -.fuelux .datepicker-calendar-header .next, -.fuelux .datepicker-calendar-header .prev { - background: #666669; - background-clip: padding-box; - border-radius: 30px; - cursor: pointer; - float: left; - height: 30px; - text-align: center; - width: 30px; -} -.fuelux .datepicker-calendar-header .next span.glyphicon, -.fuelux .datepicker-calendar-header .prev span.glyphicon { - color: #fff; - font-size: 16px; - line-height: 30px; -} -.fuelux .datepicker-calendar-header .next:hover, -.fuelux .datepicker-calendar-header .prev:hover { - background: #1d75bb; -} -.fuelux .datepicker-calendar-header .next { - float: right; -} -.fuelux .datepicker-calendar-header .next span.glyphicon { - line-height: 28px; -} -.fuelux .datepicker-calendar-footer { - background: #e3e2e1; - background-clip: padding-box; - border-radius: 0 0 4px 4px; - border-top: 1px solid #cccaca; - height: 30px; - margin: 0 -16px; - padding: 4px 14px; -} -.fuelux .datepicker-calendar-footer .datepicker-today { - color: #231f20; - font-size: 14px; - text-decoration: underline; -} -.fuelux .datepicker-calendar-footer .datepicker-today:hover { - color: #1b75bb; - text-decoration: underline; -} -.fuelux .datepicker-calendar-footer .datepicker-today.disabled { - color: #8b8c8e; - cursor: default; - pointer-events: none; -} -.fuelux .datepicker-calendar-footer .datepicker-today.disabled:hover { - color: #8b8c8e; -} -.fuelux .datepicker-calendar-wrapper { - border: 1px solid #6e6f71; - min-height: 20px; - padding: 0; - width: 300px; -} -.fuelux .datepicker-wheels { - display: none; -} -.fuelux .datepicker-wheels ul button { - border: 0; - padding: 0; - background-color: transparent; -} -.fuelux .datepicker-wheels-footer { - background: #e3e2e1; - border-radius: 0 0 4px 4px; - border-top: 1px solid #cccaca; - clear: both; -} -.fuelux .datepicker-wheels-footer .datepicker-wheels-back { - display: block; - color: #4d4d4f; - float: left; - line-height: 22px; - border: 0; - background-color: transparent; -} -.fuelux .datepicker-wheels-footer .datepicker-wheels-back:hover { - color: #1d75bb; -} -.fuelux .datepicker-wheels-footer .datepicker-wheels-select { - float: right; - background-color: transparent; - color: #049cdb; -} -.fuelux .datepicker-wheels-footer .datepicker-wheels-select:hover { - color: #1d75bb; -} -.fuelux .datepicker-wheels-month, -.fuelux .datepicker-wheels-year { - float: left; - width: 50%; -} -.fuelux .datepicker-wheels-month ul, -.fuelux .datepicker-wheels-year ul { - height: 217px; - list-style-type: none; - margin: 0; - overflow: auto; - padding: 0; - text-align: center; -} -.fuelux .datepicker-wheels-month ul li, -.fuelux .datepicker-wheels-year ul li { - margin: 4px 0; -} -.fuelux .datepicker-wheels-month ul li button, -.fuelux .datepicker-wheels-year ul li button { - width: 100%; - text-align: center; - color: #414041; - display: block; - font-size: 16px; - line-height: 24px; - text-decoration: none; -} -.fuelux .datepicker-wheels-month ul li button:hover, -.fuelux .datepicker-wheels-year ul li button:hover { - background: #aee0f8; - text-decoration: none; -} -.fuelux .datepicker-wheels-month ul li.selected button, -.fuelux .datepicker-wheels-year ul li.selected button { - background: #1d75bb; - color: #fff; -} -.fuelux .datepicker-wheels-month ul li.selected button:hover, -.fuelux .datepicker-wheels-year ul li.selected button:hover { - background: #0f5f9f; -} -.fuelux .datepicker-wheels-month .header, -.fuelux .datepicker-wheels-year .header { - background: #e3e2e1; - background-clip: padding-box; - border-bottom: 1px solid #cccaca; - border-radius: 4px 0 0 0; - color: #4d4d4f; - font-size: 20px; - font-weight: bold; - line-height: 30px; - margin-top: 0; - margin-bottom: 0; - text-align: center; -} -.fuelux .datepicker-wheels-month.full, -.fuelux .datepicker-wheels-year.full { - border-left: 0; - width: 100%; -} -.fuelux .datepicker-wheels-month.full .header, -.fuelux .datepicker-wheels-year.full .header { - border-radius: 4px 4px 0 0; -} -.fuelux .datepicker-wheels-year { - border-left: 1px solid #cccaca; - float: right; -} -.fuelux .datepicker-wheels-year .header { - border-radius: 0 4px 0 0; -} -.fuelux .infinitescroll { - overflow-y: auto; -} -.fuelux .infinitescroll .infinitescroll-end { - clear: both; - font-style: italic; - padding: 6px; - text-align: center; -} -.fuelux .infinitescroll .infinitescroll-load { - clear: both; - padding: 6px; -} -.fuelux .infinitescroll .infinitescroll-load button { - padding: 5px 12px; - width: 100%; -} -.fuelux .infinitescroll .infinitescroll-load .loader { - font-size: 32px; - height: 32px; - margin: 0 auto; - width: 32px; -} -.fuelux .dropUp { - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} -.fuelux .loader { - height: 64px; - font-size: 64px; - position: relative; - width: 64px; -} -.fuelux .loader:after, -.fuelux .loader:before { - font-family: "fuelux" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - line-height: 1; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - bottom: 0; - display: block; - left: 0; - position: absolute; - right: 0; - top: 0; -} -.fuelux .loader:before { - content: '\e000'; - opacity: 0.33; -} -.fuelux .loader.iefix:before { - color: #bcbcbc; - opacity: 1; -} -.fuelux .loader[data-frame="1"]:after { - content: '\e001'; -} -.fuelux .loader[data-frame="2"]:after { - content: '\e002'; -} -.fuelux .loader[data-frame="3"]:after { - content: '\e003'; -} -.fuelux .loader[data-frame="4"]:after { - content: '\e004'; -} -.fuelux .loader[data-frame="5"]:after { - content: '\e005'; -} -.fuelux .loader[data-frame="6"]:after { - content: '\e006'; -} -.fuelux .loader[data-frame="7"]:after { - content: '\e007'; -} -.fuelux .loader[data-frame="8"]:after { - content: '\e008'; -} -.fuelux input.glass, -.fuelux textarea.glass { - background: transparent; - border: 1px solid #fff; - box-shadow: none; -} -.fuelux input.glass:hover, -.fuelux textarea.glass:hover { - background: #d9edf7; - border-color: #66afe9; - cursor: pointer; -} -.fuelux input.glass:hover[disabled], -.fuelux textarea.glass:hover[disabled] { - background: transparent; - border-color: #fff; - cursor: not-allowed; -} -.fuelux input.glass:focus, -.fuelux textarea.glass:focus { - background: #fff; - border-color: #66afe9; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - cursor: auto; -} -.fuelux input.glass:focus[disabled], -.fuelux textarea.glass:focus[disabled] { - background: transparent; - border-color: #fff; - cursor: not-allowed; -} -.fuelux input.glass[disabled], -.fuelux textarea.glass[disabled] { - cursor: not-allowed; -} -.fuelux [data-toggle="buttons"] > .btn > input[type="radio"], -.fuelux [data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: inline; - position: absolute; - left: -9999px; -} -.fuelux .pillbox { - border: 1px solid #BBBBBB; - border-radius: 4px; - cursor: text; - padding: 3px; -} -.fuelux .pillbox[data-readonly] { - border: 1px solid transparent; -} -.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap { - display: inline-block; -} -.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap.truncated { - display: none; -} -.fuelux .pillbox[data-readonly].truncate .pillbox-more { - display: inline; -} -.fuelux .pillbox[data-readonly] .pill span.glyphicon-close { - display: none; -} -.fuelux .pillbox[data-readonly] .pillbox-add-item { - display: none; -} -.fuelux .pillbox[data-readonly] .pillbox-input-wrap { - display: none; -} -.fuelux .pillbox[data-readonly] .pillbox-input-wrap button.dropdown-toggle { - display: none; -} -.fuelux .pillbox.pills-editable .pill-group .pill span { - cursor: text; -} -.fuelux .pillbox.pills-editable .pill-group .pill span.glyphicon-close { - cursor: pointer; -} -.fuelux .pillbox > .pill-group { - margin: 0; - padding: 0; - width: 100%; -} -.fuelux .pillbox > .pill-group > .pill { - margin: 2px; - cursor: default; - float: left; - word-break: break-all; -} -.fuelux .pillbox > .pill-group > .pill.pillbox-highlight { - outline: 1px dotted #999999; -} -.fuelux .pillbox > .pill-group > .pill.truncated { - display: none; -} -.fuelux .pillbox > .pill-group > .pill .pillbox-list-edit { - border: none; - color: #333333; - font-weight: normal; - border-radius: 2px; -} -.fuelux .pillbox > .pill-group > .pill .pillbox-list-edit:focus { - outline: none; - border: none; -} -.fuelux .pillbox > .pill-group > .pill .glyphicon-close { - cursor: pointer; - top: -1px; - left: 2px; -} -.fuelux .pillbox > .pill-group > .pill .glyphicon-close:before { - content: " \00d7"; -} -.fuelux .pillbox > .pill-group > .pill .glyphicon-close:hover { - opacity: .4; -} -.fuelux .pillbox .pillbox-input-wrap { - position: relative; - margin: 4px 0 3px 3px; - float: left; -} -.fuelux .pillbox .pillbox-input-wrap.editing { - border: 1px solid #ccc; - border-radius: 4px; - margin: 2px 0 3px 3px; -} -.fuelux .pillbox .pillbox-input-wrap.editing input.pillbox-add-item { - border-radius: 4px; - color: #333; - height: 32px; -} -.fuelux .pillbox .pillbox-add-item { - border: none; - box-shadow: none; -} -.fuelux .pillbox .pillbox-add-item:focus { - outline: none; - border: none; -} -.fuelux .pillbox .pillbox-more { - cursor: pointer; - display: none; - line-height: 30px; -} -.fuelux .pillbox .suggest { - max-height: 166px; - overflow-y: auto; -} -.fuelux .pillbox .suggest > li { - white-space: nowrap; - cursor: pointer; - padding: 3px 20px; -} -.fuelux .pillbox .suggest > li.pillbox-suggest-sel { - background-color: #eeeeee; -} -.fuelux .pillbox .suggest > li:hover { - background-color: #eeeeee; -} -.fuelux .placard { - display: inline-block; - position: relative; -} -.fuelux .placard[data-ellipsis="true"].showing input.placard-field { - overflow: visible; - text-overflow: clip; - white-space: normal; -} -.fuelux .placard[data-ellipsis="true"] input.placard-field { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.fuelux .placard[data-ellipsis="true"] textarea.placard-field[readonly] { - overflow: hidden; -} -.fuelux .placard.showing .placard-footer, -.fuelux .placard.showing .placard-header, -.fuelux .placard.showing .placard-popup { - display: block; - z-index: 1; -} -.fuelux .placard.showing input.placard-field, -.fuelux .placard.showing textarea.placard-field { - background: #fff; - border: 1px solid #CCCCCC; - box-shadow: none; - position: relative; - z-index: 1; -} -.fuelux .placard input.placard-field, -.fuelux .placard textarea.placard-field { - resize: none; -} -.fuelux .placard input.placard-field[readonly], -.fuelux .placard textarea.placard-field[readonly] { - background: #fff; - cursor: auto; -} -.fuelux .placard input.placard-field[readonly].glass, -.fuelux .placard textarea.placard-field[readonly].glass { - background: none; -} -.fuelux .placard input.placard-field[readonly].glass:hover, -.fuelux .placard textarea.placard-field[readonly].glass:hover { - background: #d9edf7; - cursor: pointer; -} -.fuelux .placard input.placard-field:focus, -.fuelux .placard textarea.placard-field:focus { - border: 1px solid #CCCCCC; - box-shadow: none; -} -.fuelux .placard-cancel { - font-size: 12px; - margin-right: 4px; - vertical-align: middle; -} -.fuelux .placard-footer, -.fuelux .placard-header { - display: none; - left: 0; - line-height: 1; - position: absolute; - right: 0; -} -.fuelux .placard-footer { - padding: 4px 0 8px 0; - text-align: right; - top: 100%; -} -.fuelux .placard-header { - bottom: 100%; - padding: 8px 0 4px 0; -} -.fuelux .placard-header h1, -.fuelux .placard-header h2, -.fuelux .placard-header h3, -.fuelux .placard-header h4, -.fuelux .placard-header h5, -.fuelux .placard-header h6 { - margin: 0; -} -.fuelux .placard-popup { - background: #d9edf7; - background-clip: padding-box; - border: 1px solid #ccc; - border-radius: 4px; - bottom: -8px; - box-shadow: 0 0 0 1px #fff inset; - display: none; - left: -8px; - position: absolute; - right: -8px; - top: -8px; -} -.fuelux .radio { - /* for keyboard tabbing */ -} -.fuelux .radio.highlight { - padding: 4px; -} -.fuelux .radio.highlight.checked { - background: #e9e9e9; - border-radius: 4px; -} -.fuelux .radio input[type="radio"]:focus + .radio-label, -.fuelux .radio input[type="radio"]:hover + .radio-label, -.fuelux .radio .radio-label:hover { - color: #999999; -} -.fuelux .radio-custom { - position: relative; - /* for keyboard tabbing */ -} -.fuelux .radio-custom:after { - background: transparent; - border-radius: 6px; - content: " "; - height: 6px; - left: 4px; - position: absolute; - top: 7px; - width: 6px; -} -.fuelux .radio-custom:before { - border: 1px solid #adadad; - border-radius: 14px; - content: " "; - height: 14px; - left: 0px; - position: absolute; - top: 3px; - width: 14px; -} -.fuelux .radio-custom.checked:after { - background: #fff; -} -.fuelux .radio-custom.checked:before { - background: #39b3d7; - border-color: #39b3d7; -} -.fuelux .radio-custom.disabled { - cursor: not-allowed; -} -.fuelux .radio-custom.disabled:after { - cursor: not-allowed; -} -.fuelux .radio-custom.disabled:before { - cursor: not-allowed; - opacity: .5; -} -.fuelux .radio-custom.radio-inline:after { - left: 4px; - top: 7px; -} -.fuelux .radio-custom.radio-inline:before { - left: 0; - top: 3px; -} -.fuelux .radio-custom.radio-inline.highlight { - padding: 4px 4px 4px 24px; -} -.fuelux .radio-custom.radio-inline.highlight:after { - left: 8px; - top: 11px; -} -.fuelux .radio-custom.radio-inline.highlight:before { - left: 4px; - top: 7px; -} -.fuelux .radio-custom.radio-inline.highlight.checked { - background: #e9e9e9; - border-radius: 4px; -} -.fuelux .radio-custom input[type="radio"]:focus + .radio-label { - color: #999999; -} -.fuelux .repeater { - border: 1px solid #ddd; - border-radius: 4px; -} -.fuelux .repeater-canvas.scrolling { - bottom: 0; - left: 0; - overflow-y: auto; - position: absolute; - right: 0; - top: 0; -} -.fuelux .repeater-header, -.fuelux .repeater-footer { - background: #f9f9f9; - min-height: 50px; - padding: 8px; - *zoom: 1; -} -.fuelux .repeater-header:before, -.fuelux .repeater-footer:before, -.fuelux .repeater-header:after, -.fuelux .repeater-footer:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .repeater-header:after, -.fuelux .repeater-footer:after { - clear: both; -} -.fuelux .repeater-header-left, -.fuelux .repeater-footer-left { - float: left; -} -.fuelux .repeater-header-right, -.fuelux .repeater-footer-right { - float: right; -} -@media (max-width: 625px) { - .fuelux .repeater-header-left, - .fuelux .repeater-footer-left, - .fuelux .repeater-header-right, - .fuelux .repeater-footer-right { - float: none; - *zoom: 1; - } - .fuelux .repeater-header-left:before, - .fuelux .repeater-footer-left:before, - .fuelux .repeater-header-right:before, - .fuelux .repeater-footer-right:before, - .fuelux .repeater-header-left:after, - .fuelux .repeater-footer-left:after, - .fuelux .repeater-header-right:after, - .fuelux .repeater-footer-right:after { - display: table; - content: ""; - line-height: 0; - } - .fuelux .repeater-header-left:after, - .fuelux .repeater-footer-left:after, - .fuelux .repeater-header-right:after, - .fuelux .repeater-footer-right:after { - clear: both; - } - .fuelux .repeater-header-left, - .fuelux .repeater-footer-left { - margin-bottom: 8px; - } -} -.fuelux .repeater-header { - border-bottom: 1px solid #ddd; - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} -.fuelux .repeater-footer { - border-top: 1px solid #ddd; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.fuelux .repeater-loader { - display: none; - left: 50%; - position: absolute; - margin: -32px 0 0 -32px; - top: 50%; -} -.fuelux .repeater-viewport { - min-height: 80px; - position: relative; -} -.fuelux .repeater-pagination label { - font-weight: normal; -} -.fuelux .repeater-pagination .repeater-primaryPaging { - display: none; - vertical-align: middle; - width: 116px; -} -.fuelux .repeater-pagination .repeater-primaryPaging.active { - display: inline-block; -} -.fuelux .repeater-pagination .repeater-primaryPaging ul.dropdown-menu { - min-width: 116px; -} -.fuelux .repeater-pagination .repeater-secondaryPaging { - display: none; - width: 82px; -} -.fuelux .repeater-pagination .repeater-secondaryPaging.active { - display: inline-block; -} -.fuelux .repeater-search { - float: left; - width: 200px; -} -.fuelux .repeater-title { - display: block; - float: left; - line-height: 34px; - margin-right: 10px; -} -.fuelux .repeater[data-currentview="list"] .repeater-loader { - margin-top: -12px; -} -.fuelux .repeater[data-currentview="list"] .repeater-loader.noHeader { - margin-top: -32px; -} -.fuelux .repeater-list-check { - display: inline-block; - height: 0; - line-height: 0; - position: relative; - vertical-align: top; - width: 0; -} -.fuelux .repeater-list-check span.glyphicon { - left: -22px; - position: absolute; - top: 2px; -} -.fuelux .repeater-list-header, -.fuelux .repeater-list-items { - margin-bottom: 0; - width: 100%; -} -.fuelux .repeater-list-header td, -.fuelux .repeater-list-items td { - border-bottom: 1px solid #ddd; - border-left: 1px solid #ddd; - border-top: none; -} -.fuelux .repeater-list-header td:first-child, -.fuelux .repeater-list-items td:first-child { - border-left: none; -} -.fuelux .repeater-list-header { - background: #F9F9F9; -} -.fuelux .repeater-list-header td { - font-weight: bold; -} -.fuelux .repeater-list-header td.sortable:hover, -.fuelux .repeater-list-header td.sortable.sorted { - background: #F1F1F1; - cursor: pointer; - background-color: #f1f1f1; - background-image: -moz-linear-gradient(top, #f9f9f9, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #e5e5e5); - background-image: -o-linear-gradient(top, #f9f9f9, #e5e5e5); - background-image: linear-gradient(to bottom, #f9f9f9, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#ffe5e5e5', GradientType=0); -} -.fuelux .repeater-list-header td.sortable.sorted span.glyphicon { - display: block; -} -.fuelux .repeater-list-header td span.glyphicon { - display: none; - float: right; - margin-top: 2px; -} -.fuelux .repeater-list-items tr.empty td { - border-bottom: none; - font-style: italic; - padding: 20px; - text-align: center; - width: 100%; -} -.fuelux .repeater-list-items tr.selectable:hover { - background: #d9edf7; - cursor: pointer; -} -.fuelux .repeater-list-items tr.selected { - background: #66AFE9; - color: #fff; -} -.fuelux .repeater-list-items tr.selected:hover { - background: #428bca; -} -.fuelux .repeater-list-items tr.selected td:first-child { - padding-left: 30px; -} -.fuelux .repeater-list-wrapper { - overflow-y: auto; -} -.fuelux .repeater-thumbnail { - border: 1px solid #ddd; - color: #666; - float: left; - font-size: 12px; - height: 130px; - line-height: 36px; - margin: 10px 12px; - text-align: center; - width: 100px; - -webkit-box-shadow: 0 1px 4px 0 #ddd; - box-shadow: 0 1px 4px 0 #ddd; -} -.fuelux .repeater-thumbnail img { - display: block; - margin-top: 12px; -} -.fuelux .repeater-thumbnail-cont { - height: 100%; - overflow-y: auto; - padding: 10px; - width: 100%; -} -.fuelux .repeater-thumbnail-cont div.empty { - font-style: italic; - padding: 20px 10px; - text-align: center; -} -.fuelux .spinbox { - display: inline-block; - position: relative; -} -.fuelux .spinbox.digits-3 { - width: 60px; -} -.fuelux .spinbox.disabled .spinbox-buttons { - cursor: not-allowed; -} -.fuelux .spinbox .spinbox-input { - float: left; - padding-bottom: 3px; - /* Magic number */ - padding: 0px 25px 0px 7px; -} -.fuelux .spinbox .btn { - position: relative; - width: 20px; - height: 13px; - padding-top: 0; - padding-right: 9px; - padding-left: 9px; -} -.fuelux .spinbox .btn.disabled { - cursor: not-allowed; -} -.fuelux .spinbox .spinbox-buttons { - position: absolute; - height: 28px; - width: 20px; - right: 2px; -} -.fuelux .spinbox .spinbox-up { - padding: 0 0 14px 1px; - top: 2px; -} -.fuelux .spinbox .spinbox-up .glyphicon-chevron-up { - position: relative; - top: 0px; -} -.fuelux .spinbox .btn-group > .btn.spinbox-up { - border-top-right-radius: 4px; -} -.fuelux .spinbox .spinbox-down { - padding: 0 0 8px 1px; - top: 2px; - height: 15px; - border-bottom-left-radius: 4px; -} -.fuelux .spinbox .spinbox-down .glyphicon-chevron-down { - position: relative; - left: -1px; - top: 0px; -} -.fuelux .scheduler { - /* ------------------------------- - START DATE/TIME -------------------------------- */ - /* ------------------------------- - TIMEZONE -------------------------------- */ - /* ------------------------------- - REPEAT PANELS -------------------------------- */ - /* ------------------------------- -END -------------------------------- */ -} -.fuelux .scheduler .control-label { - min-width: 7em; -} -.fuelux .scheduler .inline-form-text { - float: left; - line-height: 27px; - margin-top: 4px; -} -.fuelux .scheduler .start-datetime.form-group { - margin-bottom: 0; -} -.fuelux .scheduler .start-datetime .form-group { - margin-left: 0; -} -.fuelux .scheduler .start-datetime .combobox { - max-width: 9em; -} -.fuelux .scheduler .start-datetime .combobox .dropdown-menu { - max-height: 200px; - overflow: auto; -} -.fuelux .scheduler .start-datetime .dropdown { - float: left; - margin: 0 10px 0 0; -} -.fuelux .scheduler .timezone-container .input-group { - max-width: 20em; -} -.fuelux .scheduler .timezone-container .dropdown-label { - height: 18px; - white-space: nowrap; - max-width: 20em; - overflow: hidden; - text-overflow: ellipsis; -} -.fuelux .scheduler .timezone-container .dropdown-menu { - max-height: 200px; - overflow: auto; -} -.fuelux .scheduler .repeat-panel { - margin-left: 0; -} -.fuelux .scheduler .repeat-panel label { - font-weight: normal; -} -.fuelux .scheduler .repeat-panel .radio { - margin-right: 10px; -} -.fuelux .scheduler .repeat-panel .form-group { - margin-left: 0; -} -.fuelux .scheduler .repeat-interval { - margin-left: 0; - *zoom: 1; -} -.fuelux .scheduler .repeat-interval:before, -.fuelux .scheduler .repeat-interval:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .scheduler .repeat-interval:after { - clear: both; -} -.fuelux .scheduler .repeat-interval .form-group { - margin-left: 0; -} -.fuelux .scheduler .repeat-interval .dropdown-menu { - max-height: 200px; - overflow: auto; -} -.fuelux .scheduler .repeat-interval .repeat-every-panel { - float: left; -} -.fuelux .scheduler .repeat-interval .repeat-every-panel .repeat-every-pretext { - padding: 0 10px; -} -.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox { - float: left; - margin-right: 10px; -} -.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox input { - margin-bottom: 0; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-date { - margin-top: 10px; - *zoom: 1; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-date:before, -.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after { - clear: both; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-date .selectlist { - margin-left: 5px; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-day { - margin-top: 10px; - *zoom: 1; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-day:before, -.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after { - clear: both; -} -.fuelux .scheduler .repeat-monthly .month-days { - margin-left: 10px; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-date { - margin-top: 10px; - *zoom: 1; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-date:before, -.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after { - clear: both; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-date .year-month-day { - margin-left: 10px; -} -.fuelux .scheduler .repeat-yearly .year-month-days { - margin-left: 10px; -} -.fuelux .scheduler .repeat-yearly .year-month { - margin-left: 10px; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-day { - margin-top: 10px; - *zoom: 1; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-day:before, -.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after { - clear: both; -} -.fuelux .scheduler .repeat-yearly .repeat-yearly-day .repeat-yearly-day-text { - margin-left: 10px; -} -.fuelux .scheduler .repeat-weekly button:not(.active) { - background-color: #fff; -} -.fuelux .scheduler .repeat-weekly .btn-group.disabled { - position: relative; - opacity: 0.65; -} -.fuelux .scheduler .repeat-weekly .btn-group.disabled:before { - background: transparent; - bottom: 0; - content: ""; - left: 0; - position: absolute; - right: 0; - top: 0; - z-index: 5; -} -.fuelux .scheduler .selectlist { - float: left; -} -.fuelux .scheduler label.radio { - float: left; - line-height: 27px; -} -.fuelux .scheduler label.radio input { - margin-top: 8px; -} -.fuelux .scheduler .repeat-end .end-after { - float: left; - display: inline-block; - margin-right: 10px; -} -.fuelux .scheduler .repeat-end .form-group { - margin-left: 0; -} -.fuelux .search.disabled .input-group-btn { - cursor: not-allowed; -} -.fuelux .selectlist.disabled { - cursor: not-allowed; -} -.fuelux .selectlist-sizer { - display: inline-block; - position: absolute; - visibility: hidden; - top: 0; -} -.fuelux .selectlist .selected-label { - overflow: hidden; - min-width: 2em; -} -.fuelux .selectlist .btn.dropdown-toggle { - white-space: normal; -} -.fuelux .selectlist .btn.dropdown-toggle .selected-label { - padding-right: 10px; - text-align: left; -} -.fuelux .tree { - border: 1px solid #999999; - border-radius: 4px 4px 4px 4px; - padding: 10px 15px 0 15px; - overflow-x: auto; - overflow-y: auto; - position: relative; - list-style: none; -} -.fuelux .tree *:focus { - outline: none; -} -.fuelux .tree button:focus { - color: #999999; -} -.fuelux .tree ul { - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - list-style: none; -} -.fuelux .tree li { - margin: 0; - margin-top: 5px; - margin-bottom: 5px; -} -.fuelux .tree .tree-loader { - margin-left: 45px; -} -.fuelux .tree .tree-open > .tree-branch-header .glyphicon-play { - transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - position: relative; - left: -5px; -} -.fuelux .tree [data-children=false] > .tree-branch-header .icon-caret:before { - content: '\00a0'; -} -.fuelux .tree .tree-branch .tree-branch-header { - position: relative; - border-radius: 6px; -} -.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name:hover { - color: #999999; -} -.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play { - font-size: 10px; - padding-right: 5px; -} -.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play:before { - position: relative; - top: -2px; -} -.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name { - white-space: nowrap; - border-radius: 6px; - background-color: transparent; - border: 0; -} -.fuelux .tree .tree-branch .tree-branch-header label { - font-weight: normal; - padding-left: 3px; - margin-bottom: 0; - cursor: pointer; -} -.fuelux .tree .tree-branch .tree-branch-children { - margin-left: 14px; -} -.fuelux .tree .tree-item { - position: relative; - cursor: pointer; - border-radius: 6px; - margin-left: 26px; -} -.fuelux .tree .tree-item .tree-item-name { - white-space: nowrap; - border-radius: 6px; - background-color: transparent; - border: 0; -} -.fuelux .tree .tree-item .tree-item-name:hover { - color: #999999; -} -.fuelux .tree .tree-item.tree-selected .tree-item-name { - background-color: #4f4f4f; - color: #fff; -} -.fuelux .tree .tree-item label { - font-weight: normal; - padding-left: 7px; - margin-bottom: 0; - cursor: pointer; -} -.fuelux .tree .icon-caret:hover + .tree-branch-name { - color: #999999; -} -.fuelux .tree.tree-folder-select .tree-branch .icon-caret { - background-color: transparent; - border: 0; -} -.fuelux .tree.tree-folder-select .tree-branch .icon-caret:hover { - cursor: pointer; - color: #999999; -} -.fuelux .tree.tree-folder-select .tree-branch > .tree-branch-name { - padding: 1px 5px 0 5px; - border-radius: 6px; -} -.fuelux .tree.tree-folder-select .tree-branch > .tree-branch-name.tree-selected { - background-color: #4f4f4f; - color: #fff; -} -.fuelux .tree.tree-folder-select .tree-branch.tree-selected > .tree-branch-header .tree-branch-name { - background-color: #4f4f4f; - color: #fff; -} -.fuelux .tree.tree-folder-select .tree-branch.tree-selected > .tree-branch-header .tree-branch-name:hover { - background-color: #4f4f4f; - color: #fff; -} -.fuelux .wizard { - *zoom: 1; - border: 1px solid #d4d4d4; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - background-color: #f9f9f9; - position: relative; - min-height: 48px; - overflow: hidden; -} -.fuelux .wizard:before, -.fuelux .wizard:after { - display: table; - content: ""; - line-height: 0; -} -.fuelux .wizard:after { - clear: both; -} -.fuelux .wizard > .steps { - list-style: none outside none; - padding: 0; - margin: 0; - width: 4000px; -} -.fuelux .wizard > .steps.previous-disabled li.complete { - cursor: default; -} -.fuelux .wizard > .steps.previous-disabled li.complete:hover { - background: #f3f4f5; - color: #468847; - cursor: default; -} -.fuelux .wizard > .steps.previous-disabled li.complete:hover .chevron:before { - border-left-color: #f3f4f5; -} -.fuelux .wizard > .steps li { - float: left; - margin: 0; - padding: 0 20px 0 30px; - height: 46px; - line-height: 46px; - position: relative; - background: #ededed; - color: #999999; - font-size: 16px; - cursor: not-allowed; -} -.fuelux .wizard > .steps li .chevron { - border: 24px solid transparent; - border-left: 14px solid #d4d4d4; - border-right: 0; - display: block; - position: absolute; - right: -14px; - top: 0; - z-index: 1; -} -.fuelux .wizard > .steps li .chevron:before { - border: 24px solid transparent; - border-left: 14px solid #ededed; - border-right: 0; - content: ""; - display: block; - position: absolute; - right: 1px; - top: -24px; -} -.fuelux .wizard > .steps li.complete { - background: #f3f4f5; - color: #468847; -} -.fuelux .wizard > .steps li.complete:hover { - background: #e7eff8; - cursor: pointer; -} -.fuelux .wizard > .steps li.complete:hover .chevron:before { - border-left: 14px solid #e7eff8; -} -.fuelux .wizard > .steps li.complete .chevron:before { - border-left: 14px solid #f3f4f5; -} -.fuelux .wizard > .steps li.active { - background: #f1f6fc; - color: #3a87ad; - cursor: default; -} -.fuelux .wizard > .steps li.active .chevron:before { - border-left: 14px solid #f1f6fc; -} -.fuelux .wizard > .steps li.active .badge { - background-color: #3a87ad; -} -.fuelux .wizard > .steps li .badge { - margin-right: 8px; -} -.fuelux .wizard > .steps li .badge-success { - background-color: #468847; -} -.fuelux .wizard > .steps li:first-child { - border-radius: 4px 0 0 4px; - padding-left: 20px; -} -.fuelux .wizard > .actions { - z-index: 1000; - position: absolute; - right: 0; - line-height: 46px; - float: right; - padding-left: 15px; - padding-right: 15px; - vertical-align: middle; - background-color: #e5e5e5; - border-left: 1px solid #d4d4d4; -} -.fuelux .wizard > .actions a { - line-height: 45px; - font-size: 12px; - margin-right: 8px; -} -.fuelux .wizard > .actions .btn-prev[disabled] { - cursor: not-allowed; -} -.fuelux .wizard > .actions .btn-prev span { - margin-right: 5px; -} -.fuelux .wizard > .actions .btn-next[disabled] { - cursor: not-allowed; -} -.fuelux .wizard > .actions .btn-next span { - margin-left: 5px; -} -.fuelux .wizard .step-content { - border-top: 1px solid #D4D4D4; - padding: 10px; - float: left; - width: 100%; -} -.fuelux .wizard .step-content .step-pane { - display: none; -} -.fuelux .wizard .step-content > .active { - display: block; -} -.fuelux .wizard .step-content > .active .btn-group .active { - display: inline-block; -} -.fuelux .wizard.complete > .actions .glyphicon-arrow-right:before { - display: none; -} -.fuelux .wizard.complete > .actions .glyphicon-arrow-right { - margin-left: 0; -} -/*# sourceMappingURL=fuelux.css.map */ \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css.map b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css.map deleted file mode 100644 index ac523ca7968107388dc347cda60c40bc8ec16b9d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/fuelux.less","less/icons.less","less/mixins.less","less/checkbox.less","less/combobox.less","less/datepicker.less","less/infinite-scroll.less","less/intelligent-dropdown.less","less/loader.less","less/misc.less","less/pillbox.less","less/placard.less","less/radio.less","less/repeater.less","less/repeater-list.less","less/repeater-thumbnail.less","less/spinbox.less","less/scheduler.less","less/search.less","less/selectlist.less","less/tree.less","less/wizard.less"],"names":[],"mappings":"AAAA;;CCAA,SAAS;ADAT,OECA;EACC,QAAA;;AACA,OAFD,UAEE;AACD,OAHD,UAGE;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,OAVD,UAUE;EACA,WAAA;;ADVF;EACC,aAAa,QAAb;EACA,SAAQ,sBAAR;EACA,SAAQ,8BAAsC,OAAO,0BACjD,wBAAgC,OAAO,aACvC,uBAA+B,OAAO,iBACtC,8BAAsC,OAAO,MAHjD;EAIA,mBAAA;EACA,kBAAA;;ADVD,OCmBA,uBAAsB;ADnBtB,OCoBA,wBAAuB;ECuCtB,aAD4B,QAC5B;EACA,6BAAA;EACA,8BAAA;EACA,+BAAA;EACA,+BAAA;EACA,cAAA;EACA,WAAA;EACA,mCAAA;EACA,kCAAA;;AFnED,OCwBA,wBAAuB;EACtB,SAAS,OAAT;;ADzBD,OC4BA,qBAAoB;EACnB,SAAS,OAAT;;AD7BD,OCgCA,qBAAoB;EACnB,SAAS,OAAT;;ADjCD,OCoCA,qBAAoB;EACnB,SAAS,OAAT;;ADrCD,OCwCA,qBAAoB;EACnB,SAAS,OAAT;;ADzCD,OC4CA,qBAAoB;EACnB,SAAS,OAAT;;AD7CD,OCgDA,qBAAoB;EACnB,SAAS,OAAT;;ADjDD,OCoDA,qBAAoB;EACnB,SAAS,OAAT;;ADrDD,OCwDA,qBAAoB;EACnB,SAAS,OAAT;;ADzDD,OC8DA,mBAAkB;EAChB,SAAS,OAAT;;AD/DF,OGoFC,CApFD;;;AAEC,OAkFA,CApFD,SAEE;EACA,YAAA;;AAEA,OA+ED,CApFD,SAEE,UAGC;EACA,mBAAA;EACA,kBAAA;;AHPH,OGoFC,CApFD,SAYC,MAAK,iBAAiB,MAAO;AHZ9B,OGoFC,CApFD,SAaC,MAAK,iBAAiB,MAAO;AHb9B,OGoFC,CApFD,SAcC,gBAAe;EACd,cAAA;;AHfF,OGoBA;EACC,kBAAA;;;AAEA,OAHD,iBAGE;EDoCD,aClCiB,sBDkCjB;EACA,6BAAA;EACA,8BAAA;EACA,+BAAA;EACA,+BAAA;EACA,cAAA;EACA,WAAA;EACA,mCAAA;EACA,kCAAA;ECxCC,yBAAA;EACA,kBAAA;EACA,WAAA;EACA,SAAS,GAAT;EACA,cAAA;EACA,YAAA;EACA,SAAA;EACA,oBAAA;EACA,kBAAA;EACA,QAAA;EACA,WAAA;;AAIA,OArBF,iBAoBE,QACC;EACA,mBAAA;EACA,qBAAA;EACA,SAAS,OAAT;;AAIF,OA5BD,iBA4BE;EACA,mBAAA;;AAEA,OA/BF,iBA4BE,SAGC;EAEA,mBAAA;EACA,WAAA;;AAKD,OAvCF,iBAsCE,gBACC;EACA,OAAA;EACA,QAAA;;AAGD,OA5CF,iBAsCE,gBAMC;EACA,yBAAA;;AAEA,OA/CH,iBAsCE,gBAMC,UAGC;EACA,SAAA;EACA,QAAA;;AAGD,OApDH,iBAsCE,gBAMC,UAQC;EACA,mBAAA;EACA,kBAAA;;AH1EJ,OGoBA,iBA4DC,MAAK,iBAAiB,MAAO;EAC5B,cAAA;;AChFD,OAKA,CAND,SACE,SACA;EACC,mBAAA;;ACDF,OA6VD,CA/VA,WAEE;EACA,oBAAA;EACA,iBAAA;;AAFD,OA6VD,CA/VA,WAEE,SAIA;EACC,SAAA;EACA,UAAA;EACA,6BAAA;;AAGD,OAmVF,CA/VA,WAEE,SAUC;EACA,aAAA;EACA,mBAAA;EACA,WAAA;;;AAHD,OAmVF,CA/VA,WAEE,SAUC,KAKA;EACC,gCAAA;;AANF,OAmVF,CA/VA,WAEE,SAUC,KAUA,MAAK;EACJ,gBAAA;EACA,SAAQ,OAAR;EACA,cAAA;;AAbF,OAmVF,CA/VA,WAEE,SAUC,KAgBA;AAhBD,OAmVF,CA/VA,WAEE,SAUC,KAgBI;EACH,eAAA;EACA,YAAA;EACA,kBAAA;EACA,sBAAA;EACA,aAAA;;AArBF,OAmVF,CA/VA,WAEE,SAUC,KAwBA,GACC;EACC,cAAA;EACA,qBAAA;EACA,YAAA;EACA,qBAAA;EACA,WAAA;;AA9BH,OAmVF,CA/VA,WAEE,SAUC,KAwBA,GASC;EACC,cAAA;;AAEA,OA+SL,CA/VA,WAEE,SAUC,KAwBA,GASC,KAGE;EACA,mBAAA;EACA,qBAAA;;AAIF,OAySJ,CA/VA,WAEE,SAUC,KAwBA,GAkBE,YACA;EACC,yBAAA;;AAIF,OAmSJ,CA/VA,WAEE,SAUC,KAwBA,GAwBE;AAAa,OAmSlB,CA/VA,WAEE,SAUC,KAwBA,GAwBgB;EACd,mBAAA;;AAGD,OA+RJ,CA/VA,WAEE,SAUC,KAwBA,GA4BE,KACA;EACC,cAAA;;AAIF,OAyRJ,CA/VA,WAEE,SAUC,KAwBA,GAkCE,WACA;EACC,eAAA;EACA,kBAAA;;AAEA,OAoRN,CA/VA,WAEE,SAUC,KAwBA,GAkCE,WACA,OAIE;EACA,6BAAA;EACA,SAAA;EACA,SAAS,GAAT;EACA,cAAA;EACA,SAAA;EACA,kBAAA;EACA,UAAA;EACA,QAAA;;AAGD,OAyQN,CA/VA,WAEE,SAUC,KAwBA,GAkCE,WACA,OAeE;EACA,gBAAA;;AAKH,OAmQJ,CA/VA,WAEE,SAUC,KAwBA,GAwDE,SACA;EACC,mBAAA;;AAEA,OA+PN,CA/VA,WAEE,SAUC,KAwBA,GAwDE,SACA,KAGE;EACA,mBAAA;;AALH,OAmQJ,CA/VA,WAEE,SAUC,KAwBA,GAwDE,SAUA;EACC,WAAA;;AAGD,OAqPL,CA/VA,WAEE,SAUC,KAwBA,GAwDE,SAcC;EACA,iCAAA;;AA/FJ,OAmVF,CA/VA,WAEE,SAUC,KAoGA;EACC,iBAAA;EACA,YAAA;EACA,mBAAA;;AAIF,OAwOF,CA/VA,WAEE,SAqHC;EHrHF,QAAA;;AACA,OG4VD,CA/VA,WAEE,SAqHC,OHpHD;AACD,OG2VD,CA/VA,WAEE,SAqHC,OHnHD;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,OGoVD,CA/VA,WAEE,SAqHC,OH5GD;EACA,WAAA;;AG2GA,OAwOF,CA/VA,WAEE,SAqHC,OAGA;EACC,SAAA;EACA,UAAA;EACA,6BAAA;;AANF,OAwOF,CA/VA,WAEE,SAqHC,OASA;EACC,cAAA;EACA,kBAAA;EACA,cAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,0BAAA;EACA,sBAAA;;AAEC,OAoNL,CA/VA,WAEE,SAqHC,OASA,OAWG;EACA,cAAA;EACA,0BAAA;;AAGD,OA+ML,CA/VA,WAEE,SAqHC,OASA,OAgBG;EACA,eAAA;EACA,oBAAA;EACA,qBAAA;;AA5BJ,OAwOF,CA/VA,WAEE,SAqHC,OASA,OAsBE;EACC,eAAA;EACA,SAAA;EACA,UAAA;;AAlCJ,OAwOF,CA/VA,WAEE,SAqHC,OASA,OAsBE,OAKC;EACC,aAAA;;AAEA,OAiMP,CA/VA,WAEE,SAqHC,OASA,OAsBE,OAKC,KAGE;EACA,eAAA;;AAxCN,OAwOF,CA/VA,WAEE,SAqHC,OA8CA;AA9CD,OAwOF,CA/VA,WAEE,SAqHC,OA8CO;EACN,mBAAA;EACA,4BAAA;EACA,mBAAA;EACA,eAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,WAAA;;AAtDF,OAwOF,CA/VA,WAEE,SAqHC,OA8CA,MAUC,KAAI;AAxDN,OAwOF,CA/VA,WAEE,SAqHC,OA8CO,MAUN,KAAI;EACH,WAAA;EACA,eAAA;EACA,iBAAA;;AAGD,OA0KJ,CA/VA,WAEE,SAqHC,OA8CA,MAgBE;AAAD,OA0KJ,CA/VA,WAEE,SAqHC,OA8CO,MAgBL;EACA,mBAAA;;AA/DH,OAwOF,CA/VA,WAEE,SAqHC,OAmEA;EACC,YAAA;;AApEF,OAwOF,CA/VA,WAEE,SAqHC,OAmEA,MAGC,KAAI;EACH,iBAAA;;AAKH,OA4JF,CA/VA,WAEE,SAiMC;EACA,mBAAA;EACA,4BAAA;EACA,0BAAA;EACA,6BAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;;AAPD,OA4JF,CA/VA,WAEE,SAiMC,OASA;EACC,cAAA;EACA,eAAA;EACA,0BAAA;;AAEA,OA8IJ,CA/VA,WAEE,SAiMC,OASA,kBAKE;EACA,cAAA;EACA,0BAAA;;AAGD,OAyIJ,CA/VA,WAEE,SAiMC,OASA,kBAUE;EACA,cAAA;EACA,eAAA;EACA,oBAAA;;AAEA,OAoIL,CA/VA,WAEE,SAiMC,OASA,kBAUE,SAKC;EACA,cAAA;;AAOL,OA4HD,CA/VA,WAmOE;EACA,yBAAA;EACA,gBAAA;EACA,UAAA;EACA,YAAA;;AAGD,OAqHD,CA/VA,WA0OE;EACA,aAAA;;AADD,OAqHD,CA/VA,WA0OE,OAGA,GAAG;EACF,SAAA;EACA,UAAA;EACA,6BAAA;;AAGD,OA4GF,CA/VA,WA0OE,OASC;EACA,mBAAA;EACA,0BAAA;EACA,6BAAA;EACA,WAAA;;AAJD,OA4GF,CA/VA,WA0OE,OASC,OAMA;EACC,cAAA;EACA,cAAA;EACA,WAAA;EACA,iBAAA;EACA,SAAA;EACA,6BAAA;;AAEA,OA8FJ,CA/VA,WA0OE,OASC,OAMA,wBAQE;EACA,cAAA;;AAfH,OA4GF,CA/VA,WA0OE,OASC,OAmBA;EACC,YAAA;EACA,6BAAA;EACA,cAAA;;AAEA,OAoFJ,CA/VA,WA0OE,OASC,OAmBA,0BAKE;EACA,cAAA;;AAKH,OA8EF,CA/VA,WA0OE,OAuCC;AAAQ,OA8EX,CA/VA,WA0OE,OAuCU;EACT,WAAA;EACA,UAAA;;AAFD,OA8EF,CA/VA,WA0OE,OAuCC,MAIA;AAJQ,OA8EX,CA/VA,WA0OE,OAuCU,KAIT;EACC,aAAA;EACA,qBAAA;EACA,SAAA;EACA,cAAA;EACA,UAAA;EACA,kBAAA;;AAVF,OA8EF,CA/VA,WA0OE,OAuCC,MAIA,GAQC;AAZO,OA8EX,CA/VA,WA0OE,OAuCU,KAIT,GAQC;EACC,aAAA;;AAbH,OA8EF,CA/VA,WA0OE,OAuCC,MAIA,GAQC,GAGC;AAfM,OA8EX,CA/VA,WA0OE,OAuCU,KAIT,GAQC,GAGC;EAEC,WAAA;EACA,kBAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,qBAAA;;AAEA,OAqDN,CA/VA,WA0OE,OAuCC,MAIA,GAQC,GAGC,OAUE;AAAD,OAqDN,CA/VA,WA0OE,OAuCU,KAIT,GAQC,GAGC,OAUE;EACA,mBAAA;EACA,qBAAA;;AAIF,OA+CL,CA/VA,WA0OE,OAuCC,MAIA,GAQC,GAmBE,SACA;AADD,OA+CL,CA/VA,WA0OE,OAuCU,KAIT,GAQC,GAmBE,SACA;EACC,mBAAA;EACA,WAAA;;AAEA,OA0CP,CA/VA,WA0OE,OAuCC,MAIA,GAQC,GAmBE,SACA,OAIE;AAAD,OA0CP,CA/VA,WA0OE,OAuCU,KAIT,GAQC,GAmBE,SACA,OAIE;EACA,mBAAA;;AArCN,OA8EF,CA/VA,WA0OE,OAuCC,MA4CA;AA5CQ,OA8EX,CA/VA,WA0OE,OAuCU,KA4CT;EACC,mBAAA;EACA,4BAAA;EACA,gCAAA;EACA,wBAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;;AAGD,OAoBH,CA/VA,WA0OE,OAuCC,MA0DC;AAAD,OAoBH,CA/VA,WA0OE,OAuCU,KA0DR;EACA,cAAA;EACA,WAAA;;AAFD,OAoBH,CA/VA,WA0OE,OAuCC,MA0DC,KAIA;AAJD,OAoBH,CA/VA,WA0OE,OAuCU,KA0DR,KAIA;EACC,0BAAA;;AAKH,OAUF,CA/VA,WA0OE,OA2GC;EACA,8BAAA;EACA,YAAA;;AAFD,OAUF,CA/VA,WA0OE,OA2GC,KAIA;EACC,wBAAA;;AL1VJ,OM0BC,CA1BD;EACC,gBAAA;;ANDD,OM0BC,CA1BD,eAGC;EACC,WAAA;EACA,kBAAA;EACA,YAAA;EACA,kBAAA;;ANPF,OM0BC,CA1BD,eAUC;EACC,WAAA;EACA,YAAA;;ANZF,OM0BC,CA1BD,eAUC,qBAIC;EACC,iBAAA;EACA,WAAA;;ANhBH,OM0BC,CA1BD,eAUC,qBASC;EACC,eAAA;EACA,YAAA;EACA,cAAA;EACA,WAAA;;ANvBH,OOIC,CAJD;EACC,+CAAA;EACA,4CAAA;EACA,uCAAA;;APHD,OQ0DC,CA1DD;EACI,YAAA;EACA,eAAA;EACA,kBAAA;EACA,WAAA;;AAEH,OAoDA,CA1DD,OAME;AAAQ,OAoDT,CA1DD,OAMW;ENqDV,aAD4B,QAC5B;EACA,6BAAA;EACA,8BAAA;EACA,+BAAA;EACA,+BAAA;EACA,cAAA;EACA,WAAA;EACA,mCAAA;EACA,kCAAA;EM1DC,SAAA;EACA,cAAA;EACA,OAAA;EACA,kBAAA;EACA,QAAA;EACA,MAAA;;AAGD,OAyCA,CA1DD,OAiBE;EACA,SAAS,OAAT;EACA,aAAA;;AAGD,OAoCA,CA1DD,OAsBE,MAAM;EACN,cAAA;EACA,UAAA;;AAGD,OA+BA,CA1DD,OA2BE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OA2BA,CA1DD,OA+BE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAuBA,CA1DD,OAmCE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAmBA,CA1DD,OAuCE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAeA,CA1DD,OA2CE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAWA,CA1DD,OA+CE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAOA,CA1DD,OAmDE,gBAAgB;EAChB,SAAS,OAAT;;AAGD,OAGA,CA1DD,OAuDE,gBAAgB;EAChB,SAAS,OAAT;;ACvDD,OA0CA,CA3CD,KACE;AAAD,OADM,SACL;EACA,uBAAA;EACA,sBAAA;EACA,gBAAA;;AAEA,OAqCD,CA3CD,KACE,MAKC;AAAD,OANK,SACL,MAKC;EACA,mBAAA;EACA,qBAAA;EACA,eAAA;;AAEA,OAgCF,CA3CD,KACE,MAKC,MAKC;AAAD,OAXI,SACL,MAKC,MAKC;EACA,uBAAA;EACA,kBAAA;EACA,mBAAA;;AAIF,OAyBD,CA3CD,KACE,MAiBC;AAAD,OAlBK,SACL,MAiBC;EACA,gBAAA;EACA,qBAAA;EACA,kFAAA;EACA,YAAA;;AAEA,OAmBF,CA3CD,KACE,MAiBC,MAMC;AAAD,OAxBI,SACL,MAiBC,MAMC;EACA,uBAAA;EACA,kBAAA;EACA,mBAAA;;AAIF,OAYD,CA3CD,KACE,MA8BC;AAAD,OA/BK,SACL,MA8BC;EACA,mBAAA;;AThCH,OSsCA,wBAAwB,OAAO,QAAO;ATtCtC,OSuCA,wBAAwB,OAAO,QAAO;EACrC,eAAA;EACA,kBAAA;EACA,aAAA;;AT1CD,OU6JA,CA7JA;EACC,yBAAA;EACA,kBAAA;EACA,YAAA;EACA,YAAA;;AAEA,OAuJD,CA7JA,QAME;EACA,6BAAA;;AAEA,OAoJF,CA7JA,QAME,eAGC,SACA;EACC,qBAAA;;AAEA,OAgJJ,CA7JA,QAME,eAGC,SACA,oBAGE;EACA,aAAA;;AALH,OAoJF,CA7JA,QAME,eAGC,SASA;EACC,eAAA;;AAbH,OAuJD,CA7JA,QAME,eAiBA,MACC,KAAI;EACH,aAAA;;AAnBH,OAuJD,CA7JA,QAME,eAuBA;EACC,aAAA;;AAxBF,OAuJD,CA7JA,QAME,eA2BA;EACC,aAAA;;AA5BF,OAuJD,CA7JA,QAME,eA2BA,oBAGC,OAAM;EACL,aAAA;;AAKH,OAmHD,CA7JA,QA0CE,eACA,YACC,MACC;EACC,YAAA;;AAEA,OA6GL,CA7JA,QA0CE,eACA,YACC,MACC,KAGE;EACA,eAAA;;AVjDN,OU6JA,CA7JA,QAwDC;EACC,SAAA;EACA,UAAA;EACA,WAAA;;AV3DF,OU6JA,CA7JA,QAwDC,cAKC;EACC,WAAA;EACA,eAAA;EACA,WAAA;EACA,qBAAA;;AAEA,OA0FH,CA7JA,QAwDC,cAKC,QAME;EACA,2BAAA;;AAGD,OAsFH,CA7JA,QAwDC,cAKC,QAUE;EACA,aAAA;;AVxEJ,OU6JA,CA7JA,QAwDC,cAKC,QAcC;EACC,YAAA;EACA,cAAA;EACA,mBAAA;EACA,kBAAA;;AAEA,OA4EJ,CA7JA,QAwDC,cAKC,QAcC,mBAME;EACA,aAAA;EACA,YAAA;;AVnFL,OU6JA,CA7JA,QAwDC,cAKC,QA0BC;EACC,eAAA;EACA,SAAA;EACA,SAAA;;AAEA,OAiEJ,CA7JA,QAwDC,cAKC,QA0BC,iBAKE;EACA,SAAS,QAAT;;AAGD,OA6DJ,CA7JA,QAwDC,cAKC,QA0BC,iBASE;EACA,WAAA;;AVjGL,OU6JA,CA7JA,QAwGC;EACC,kBAAA;EACA,qBAAA;EACA,WAAA;;AAEA,OAgDF,CA7JA,QAwGC,oBAKE;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;;AAHD,OAgDF,CA7JA,QAwGC,oBAKE,QAKA,MAAK;EACJ,kBAAA;EACA,WAAA;EACA,YAAA;;AVrHJ,OU6JA,CA7JA,QA0HC;EACC,YAAA;EACA,gBAAA;;AAEA,OA+BF,CA7JA,QA0HC,kBAIE;EACA,aAAA;EACA,YAAA;;AVhIH,OU6JA,CA7JA,QAoIC;EACC,eAAA;EACA,aAAA;EACA,iBAAA;;AVvIF,OU6JA,CA7JA,QA0IC;EACC,iBAAA;EACA,gBAAA;;AV5IF,OU6JA,CA7JA,QA0IC,SAIC;EACC,mBAAA;EACA,eAAA;EACA,iBAAA;;AAEA,OAUH,CA7JA,QA0IC,SAIC,KAKE;EACA,yBAAA;;AAGD,OAMH,CA7JA,QA0IC,SAIC,KASE;EACA,yBAAA;;AVxJJ,OW8GA,CA9GA;EACC,qBAAA;EACA,kBAAA;;AAGC,OAyGF,CA9GA,QAIE,sBACC,QACA,MAAK;EACJ,iBAAA;EACA,mBAAA;EACA,mBAAA;;AALH,OA0GD,CA9GA,QAIE,sBASA,MAAK;EACJ,gBAAA;EACA,uBAAA;EACA,mBAAA;;AAIA,OA0FH,CA9GA,QAIE,sBAeA,SAAQ,cACN;EACA,gBAAA;;AAKH,OAoFD,CA9GA,QA0BE,QACA;AADD,OAoFD,CA9GA,QA0BE,QAEA;AAFD,OAoFD,CA9GA,QA0BE,QAGA;EACC,cAAA;EACA,UAAA;;AALF,OAoFD,CA9GA,QA0BE,QAQA,MAAK;AARN,OAoFD,CA9GA,QA0BE,QAQqB,SAAQ;EAC5B,gBAAA;EACA,yBAAA;EACA,gBAAA;EACA,kBAAA;EACA,UAAA;;AXvCH,OW8GA,CA9GA,QA2CC,MAAK;AX3CN,OW8GA,CA9GA,QA2CsB,SAAQ;EAC5B,YAAA;;AAEA,OAgEF,CA9GA,QA2CC,MAAK,cAGH;AAAD,OAgEF,CA9GA,QA2CsB,SAAQ,cAG3B;EACA,gBAAA;EACA,YAAA;;AAEA,OA4DH,CA9GA,QA2CC,MAAK,cAGH,UAIC;AAAD,OA4DH,CA9GA,QA2CsB,SAAQ,cAG3B,UAIC;EACA,gBAAA;;AAEA,OAyDJ,CA9GA,QA2CC,MAAK,cAGH,UAIC,MAGC;AAAD,OAyDJ,CA9GA,QA2CsB,SAAQ,cAG3B,UAIC,MAGC;EACA,mBAAA;EACA,eAAA;;AAKH,OAkDF,CA9GA,QA2CC,MAAK,cAiBH;AAAD,OAkDF,CA9GA,QA2CsB,SAAQ,cAiB3B;EACA,yBAAA;EACA,gBAAA;;AAIF,OA4CD,CA9GA,QAkEE;EACA,eAAA;EACA,iBAAA;EACA,sBAAA;;AAGD,OAsCD,CA9GA,QAwEE;AACD,OAqCD,CA9GA,QAyEE;EACA,aAAA;EACA,OAAA;EACA,cAAA;EACA,kBAAA;EACA,QAAA;;AAGD,OA6BD,CA9GA,QAiFE;EACA,oBAAA;EACA,iBAAA;EACA,SAAA;;AAGD,OAuBD,CA9GA,QAuFE;EACA,YAAA;EACA,oBAAA;;AAFD,OAuBD,CA9GA,QAuFE,OAIA;AAJD,OAuBD,CA9GA,QAuFE,OAII;AAJL,OAuBD,CA9GA,QAuFE,OAIQ;AAJT,OAuBD,CA9GA,QAuFE,OAIY;AAJb,OAuBD,CA9GA,QAuFE,OAIgB;AAJjB,OAuBD,CA9GA,QAuFE,OAIoB;EACnB,SAAA;;AAIF,OAcD,CA9GA,QAgGE;EACA,mBAAA;EACA,4BAAA;EACA,sBAAA;EACA,kBAAA;EACA,YAAA;EACA,gCAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;EACA,SAAA;;AX3GF,OY0GA,CA1GA;;;AACC,OAyGD,CA1GA,MACE;EACA,YAAA;;AAEA,OAsGF,CA1GA,MACE,UAGC;EACA,mBAAA;EACA,kBAAA;;AZNH,OY0GA,CA1GA,MAWC,MAAK,cAAc,MAAO;AZX3B,OY0GA,CA1GA,MAYC,MAAK,cAAc,MAAO;AZZ3B,OY0GA,CA1GA,MAaC,aAAY;EACX,cAAA;;AZdF,OYmBA;EACC,kBAAA;;;AAEA,OAHD,cAGE;EACA,uBAAA;EACA,kBAAA;EACA,SAAS,GAAT;EACA,WAAA;EACA,SAAA;EACA,kBAAA;EACA,QAAA;EACA,UAAA;;AAGD,OAdD,cAcE;EAEA,yBAAA;EACA,mBAAA;EACA,SAAS,GAAT;EACA,YAAA;EACA,SAAA;EACA,kBAAA;EACA,QAAA;EACA,WAAA;;AAIA,OA3BF,cA0BE,QACC;EACA,gBAAA;;AAGD,OA/BF,cA0BE,QAKC;EACA,mBAAA;EACA,qBAAA;;AAIF,OArCD,cAqCE;EACA,mBAAA;;AAEA,OAxCF,cAqCE,SAGC;EACA,mBAAA;;AAGD,OA5CF,cAqCE,SAOC;EACA,mBAAA;EACA,WAAA;;AAKD,OAnDF,cAkDE,aACC;EACA,SAAA;EACA,QAAA;;AAGD,OAxDF,cAkDE,aAMC;EACA,OAAA;EACA,QAAA;;AAGD,OA7DF,cAkDE,aAWC;EACA,yBAAA;;AAEA,OAhEH,cAkDE,aAWC,UAGC;EACA,SAAA;EACA,SAAA;;AAGD,OArEH,cAkDE,aAWC,UAQC;EACA,SAAA;EACA,QAAA;;AAGD,OA1EH,cAkDE,aAWC,UAaC;EACA,mBAAA;EACA,kBAAA;;AZ/FJ,OYmBA,cAkFC,MAAK,cAAc,MAAO;EACzB,cAAA;;AZtGF,Oa4GC,CA5GD;EACC,sBAAA;EACA,kBAAA;;AAGC,OAuGD,CA5GD,SAIE,OACC;EACA,SAAA;EACA,OAAA;EACA,gBAAA;EACA,kBAAA;EACA,QAAA;EACA,MAAA;;AAIF,OA6FA,CA5GD,SAeE;AACD,OA4FA,CA5GD,SAgBE;EAEA,mBAAA;EACA,gBAAA;EACA,YAAA;EXlBD,QAAA;;AACA,OWyGA,CA5GD,SAeE,OXZA;AAAD,OWyGA,CA5GD,SAgBE,OXbA;AACD,OWwGA,CA5GD,SAeE,OXXA;AAAD,OWwGA,CA5GD,SAgBE,OXZA;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,OWiGA,CA5GD,SAeE,OXJA;AAAD,OWiGA,CA5GD,SAgBE,OXLA;EACA,WAAA;;AWWA,OAqFD,CA5GD,SAeE,OAQC;AAAD,OAqFD,CA5GD,SAgBE,OAOC;EACA,WAAA;;AAGD,OAiFD,CA5GD,SAeE,OAYC;AAAD,OAiFD,CA5GD,SAgBE,OAWC;EACA,YAAA;;AAcF,QAX2B;EACzB,OA4EF,CA5GD,SAeE,OAiBE;EAAD,OA4EF,CA5GD,SAgBE,OAgBE;EACD,OA2EF,CA5GD,SAeE,OAkBE;EAAD,OA2EF,CA5GD,SAgBE,OAiBE;IACA,WAAA;IXhCH,QAAA;;EACA,OWyGA,CA5GD,SAeE,OAiBE,KX7BF;EAAD,OWyGA,CA5GD,SAgBE,OAgBE,KX7BF;EAAD,OWyGA,CA5GD,SAeE,OAkBE,MX9BF;EAAD,OWyGA,CA5GD,SAgBE,OAiBE,MX9BF;EACD,OWwGA,CA5GD,SAeE,OAiBE,KX5BF;EAAD,OWwGA,CA5GD,SAgBE,OAgBE,KX5BF;EAAD,OWwGA,CA5GD,SAeE,OAkBE,MX7BF;EAAD,OWwGA,CA5GD,SAgBE,OAiBE,MX7BF;IACA,cAAA;IACA,SAAS,EAAT;IAGA,cAAA;;EAED,OWiGA,CA5GD,SAeE,OAiBE,KXrBF;EAAD,OWiGA,CA5GD,SAgBE,OAgBE,KXrBF;EAAD,OWiGA,CA5GD,SAeE,OAkBE,MXtBF;EAAD,OWiGA,CA5GD,SAgBE,OAiBE,MXtBF;IACA,WAAA;;EW0BC,OAsEF,CA5GD,SAeE,OAuBE;EAAD,OAsEF,CA5GD,SAgBE,OAsBE;IACA,kBAAA;;;AAKH,OAgEA,CA5GD,SA4CE;EACA,6BAAA;EX3BD,4BAAA;EACA,2BAAA;;AW8BA,OA2DA,CA5GD,SAiDE;EACA,0BAAA;EXxBD,+BAAA;EACA,8BAAA;;AW2BA,OAsDA,CA5GD,SAsDE;EACA,aAAA;EACA,SAAA;EACA,kBAAA;EACA,uBAAA;EACA,QAAA;;AAGD,OA8CA,CA5GD,SA8DE;EACA,gBAAA;EACA,kBAAA;;AAGD,OAyCA,CA5GD,SAmEE,WAEA;EACC,mBAAA;;AAHF,OAyCA,CA5GD,SAmEE,WAMA;EACC,aAAA;EACA,sBAAA;EACA,YAAA;;AAEA,OA8BF,CA5GD,SAmEE,WAMA,wBAKE;EACA,qBAAA;;AAZH,OAyCA,CA5GD,SAmEE,WAMA,wBASC,GAAE;EACD,gBAAA;;AAhBH,OAyCA,CA5GD,SAmEE,WAoBA;EACC,aAAA;EACA,WAAA;;AAEA,OAiBF,CA5GD,SAmEE,WAoBA,0BAIE;EACA,qBAAA;;AAKH,OAWA,CA5GD,SAiGE;EACA,WAAA;EACA,YAAA;;AAGD,OAMA,CA5GD,SAsGE;EACA,cAAA;EACA,WAAA;EACA,iBAAA;EACA,kBAAA;;Ab1GF,Oc6GC,CA7GD,SAAS,yBACR;EACC,iBAAA;;AAEA,OAyGD,CA7GD,SAAS,yBACR,iBAGE;EACA,iBAAA;;AAMF,OADD,eACE;EACA,qBAAA;EACA,SAAA;EACA,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,QAAA;;AAND,OADD,eACE,MAQA,KAAI;EACH,WAAA;EACA,kBAAA;EACA,QAAA;;AAIF,OAhBD,eAgBE;AACD,OAjBD,eAiBE;EACA,gBAAA;EACA,WAAA;;AAHD,OAhBD,eAgBE,OAKA;AAJD,OAjBD,eAiBE,MAIA;EACC,6BAAA;EACA,2BAAA;EACA,gBAAA;;AAEA,OA1BH,eAgBE,OAKA,GAKE;AAAD,OA1BH,eAiBE,MAIA,GAKE;EACA,iBAAA;;AAKH,OAhCD,eAgCE;EACA,mBAAA;;AADD,OAhCD,eAgCE,OAGA;EACC,iBAAA;;AAGC,OAvCJ,eAgCE,OAGA,GAGE,SACC;AACD,OAxCJ,eAgCE,OAGA,GAGE,SAEC;EAEA,mBAAA;EACA,eAAA;EZPH,yBAAA;EACA,kBAAkB,2CAAlB;EACA,kBAAkB,sCAAsC,eAAmB,YAA3E;EACA,kBAAkB,8CAAlB;EACA,kBAAkB,yCAAlB;EACA,kBAAkB,4CAAlB;EACA,2BAAA;EACA,sHAAA;;AYIE,OA/CJ,eAgCE,OAGA,GAGE,SASC,OACA,KAAI;EACH,cAAA;;AAjBL,OAhCD,eAgCE,OAGA,GAmBC,KAAI;EACH,aAAA;EACA,YAAA;EACA,eAAA;;AAOD,OAhEH,eA8DE,MACA,GACE,MACA;EACC,mBAAA;EACA,kBAAA;EACA,aAAA;EACA,kBAAA;EACA,WAAA;;AAKD,OA3EJ,eA8DE,MACA,GAWE,WACC;EACA,mBAAA;EACA,eAAA;;AAIF,OAjFH,eA8DE,MACA,GAkBE;EACA,mBAAA;EACA,WAAA;;AAEA,OArFJ,eA8DE,MACA,GAkBE,SAIC;EACA,mBAAA;;AALF,OAjFH,eA8DE,MACA,GAkBE,SAQA,GAAE;EACD,kBAAA;;AAMJ,OAhGD,eAgGE;EACA,gBAAA;;Ad3GF,Oe+BC,CA/BD;EACC,sBAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;EACA,aAAA;EACA,iBAAA;EACA,iBAAA;EACA,kBAAA;EACA,YAAA;EAEA,oCAAA;EACA,4BAAA;;AfZD,Oe+BC,CA/BD,mBAcC;EACC,cAAA;EACA,gBAAA;;AAGD,OAYA,CA/BD,mBAmBE;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,WAAA;;AAJD,OAYA,CA/BD,mBAmBE,KAMA,IAAG;EACF,kBAAA;EACA,kBAAA;EACA,kBAAA;;Af5BH,OgBmEC,CAnED;EACC,qBAAA;EACA,kBAAA;;AAEA,OA+DA,CAnED,QAIE;EACA,WAAA;;AAGD,OA2DA,CAnED,QAQE,SACA;EACC,mBAAA;;AhBVH,OgBmEC,CAnED,QAcC;EACC,WAAA;EACA,mBAAA;;EACA,yBAAA;;AhBjBF,OgBmEC,CAnED,QAoBC;EACC,kBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,kBAAA;EACA,iBAAA;;AAEA,OAuCD,CAnED,QAoBC,KAQE;EACA,mBAAA;;AhB7BH,OgBmEC,CAnED,QAiCC;EACC,kBAAA;EACA,YAAA;EACA,WAAA;EACA,UAAA;;AhBrCF,OgBmEC,CAnED,QAwCC;EACC,qBAAA;EACA,QAAA;;AhB1CF,OgBmEC,CAnED,QAwCC,YAIC;EACC,kBAAA;EACA,QAAA;;AhB9CH,OgBmEC,CAnED,QAmDC,WAAW,OAAM;EAChB,4BAAA;;AhBpDF,OgBmEC,CAnED,QAuDC;EACC,oBAAA;EACA,QAAA;EACA,YAAA;EACA,8BAAA;;AhB3DF,OgBmEC,CAnED,QAuDC,cAMC;EACC,kBAAA;EACA,UAAA;EACA,QAAA;;AhBhEH,OiBqPC,CArPD;;;;;;;;;;;;;;AjBAA,OiBqPC,CArPD,UAEC;EACC,cAAA;;AjBHF,OiBqPC,CArPD,UAMC;EACC,WAAA;EACA,iBAAA;EACA,eAAA;;AASA,OAmOD,CArPD,UAgBC,gBAEE;EACA,gBAAA;;AjBnBH,OiBqPC,CArPD,UAgBC,gBAMC;EACC,cAAA;;AjBvBH,OiBqPC,CArPD,UAgBC,gBAUC;EACC,cAAA;;AjB3BH,OiBqPC,CArPD,UAgBC,gBAUC,UAGC;EACC,iBAAA;EACA,cAAA;;AjB/BJ,OiBqPC,CArPD,UAgBC,gBAoBC;EACC,WAAA;EACA,kBAAA;;AjBtCH,OiBqPC,CArPD,UA+CC,oBACC;EACC,eAAA;;AjBjDH,OiBqPC,CArPD,UA+CC,oBAKC;EACC,YAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,uBAAA;;AjBzDH,OiBqPC,CArPD,UA+CC,oBAaC;EACC,iBAAA;EACA,cAAA;;AjB9DH,OiBqPC,CArPD,UAuEC;EACC,cAAA;;AjBxEF,OiBqPC,CArPD,UAuEC,cAGC;EACC,mBAAA;;AjB3EH,OiBqPC,CArPD,UAuEC,cAOC;EACC,kBAAA;;AjB/EH,OiBqPC,CArPD,UAuEC,cAWC;EACC,cAAA;;AjBnFH,OiBqPC,CArPD,UA0FC;EACC,cAAA;EfzFD,QAAA;;AACA,OekPA,CArPD,UA0FC,iBfvFC;AACD,OeiPA,CArPD,UA0FC,iBftFC;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,Oe0OA,CArPD,UA0FC,iBf/EC;EACA,WAAA;;AFZF,OiBqPC,CArPD,UA0FC,iBAKC;EACC,cAAA;;AjBhGH,OiBqPC,CArPD,UA0FC,iBASC;EACC,iBAAA;EACA,cAAA;;AjBrGH,OiBqPC,CArPD,UA0FC,iBAcC;EACC,WAAA;;AjBzGH,OiBqPC,CArPD,UA0FC,iBAcC,oBAGC;EACC,eAAA;;AjB5GJ,OiBqPC,CArPD,UA0FC,iBAcC,oBAOC;EACC,WAAA;EACA,kBAAA;;AjBjHJ,OiBqPC,CArPD,UA0FC,iBAcC,oBAOC,SAIC;EACC,gBAAA;;AjBpHL,OiBqPC,CArPD,UA8HE,gBAEC;EACC,gBAAA;Ef/HH,QAAA;;AACA,OekPA,CArPD,UA8HE,gBAEC,qBf7HD;AACD,OeiPA,CArPD,UA8HE,gBAEC,qBf5HD;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,Oe0OA,CArPD,UA8HE,gBAEC,qBfrHD;EACA,WAAA;;AFZF,OiBqPC,CArPD,UA8HE,gBAEC,qBAIC;EACC,gBAAA;;AjBrIL,OiBqPC,CArPD,UA8HE,gBAWC;EACC,gBAAA;EfxIH,QAAA;;AACA,OekPA,CArPD,UA8HE,gBAWC,oBftID;AACD,OeiPA,CArPD,UA8HE,gBAWC,oBfrID;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,Oe0OA,CArPD,UA8HE,gBAWC,oBf9HD;EACA,WAAA;;AFZF,OiBqPC,CArPD,UA8HE,gBAgBC;EACC,iBAAA;;AjB/IJ,OiBqPC,CArPD,UAsJE,eAEC;EACC,gBAAA;EfvJH,QAAA;;AACA,OekPA,CArPD,UAsJE,eAEC,oBfrJD;AACD,OeiPA,CArPD,UAsJE,eAEC,oBfpJD;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,Oe0OA,CArPD,UAsJE,eAEC,oBf7ID;EACA,WAAA;;AFZF,OiBqPC,CArPD,UAsJE,eAEC,oBAIC;EACC,iBAAA;;AjB7JL,OiBqPC,CArPD,UAsJE,eAWC;EACC,iBAAA;;AjBlKJ,OiBqPC,CArPD,UAsJE,eAeC;EACC,iBAAA;;AjBtKJ,OiBqPC,CArPD,UAsJE,eAoBC;EACC,gBAAA;EfzKH,QAAA;;AACA,OekPA,CArPD,UAsJE,eAoBC,mBfvKD;AACD,OeiPA,CArPD,UAsJE,eAoBC,mBftKD;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,Oe0OA,CArPD,UAsJE,eAoBC,mBf/JD;EACA,WAAA;;AFZF,OiBqPC,CArPD,UAsJE,eAoBC,mBAIC;EACC,iBAAA;;AjB/KL,OiBqPC,CArPD,UAwLE,eAEC,OAAM,IAAI;EACT,sBAAA;;AAIA,OAsDH,CArPD,UAwLE,eAMC,WACE;EACA,kBAAA;EACA,aAAA;;AAEA,OAkDJ,CArPD,UAwLE,eAMC,WACE,SAIC;EACA,uBAAA;EACA,SAAA;EACA,SAAS,EAAT;EACA,OAAA;EACA,kBAAA;EACA,QAAA;EACA,MAAA;EACA,UAAA;;AjB3MN,OiBqPC,CArPD,UAiNE;EACC,WAAA;;AjBlNH,OiBqPC,CArPD,UAqNE,MAAK;EACJ,WAAA;EACA,iBAAA;;AjBvNH,OiBqPC,CArPD,UAqNE,MAAK,MAIJ;EACC,eAAA;;AjB1NJ,OiBqPC,CArPD,UAkOC,YAEC;EACC,WAAA;EACA,qBAAA;EACA,kBAAA;;AjBvOH,OiBqPC,CArPD,UAkOC,YAQC;EACC,cAAA;;AC1OF,OAKA,CAND,OACE,SACA;EACC,mBAAA;;ACDF,OAwBA,CA1BD,WAEE;EACA,mBAAA;;AAGD,OAoBA,CA1BD,WAME;EACA,qBAAA;EACA,kBAAA;EACA,kBAAA;EACA,MAAA;;AnBVF,OmB0BC,CA1BD,WAaC;EACC,gBAAA;EACA,cAAA;;AnBfF,OmB0BC,CA1BD,WAkBC,KAAI;EACH,mBAAA;;AnBnBF,OmB0BC,CA1BD,WAkBC,KAAI,gBAGH;EACC,mBAAA;EACA,gBAAA;;AnBvBH,OoBqKC,CArKD;EACC,yBAAA;EACA,8BAAA;EACA,yBAAA;EACA,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,gBAAA;;ApBPD,OoBqKC,CArKD,KASC,EAAC;EACA,aAAA;;ApBVF,OoBqKC,CArKD,KAaC,OAAM;EACL,cAAA;;ApBdF,OoBqKC,CArKD,KAiBC;EACC,eAAA;EACA,aAAA;EACA,gBAAA;EACA,gBAAA;;ApBrBF,OoBqKC,CArKD,KAwBC;EACC,SAAA;EACA,eAAA;EACA,kBAAA;;ApB3BF,OoBqKC,CArKD,KA8BC;EAEC,iBAAA;;ApBhCF,OoBqKC,CArKD,KAmCC,WAAW,sBAAsB;EAChC,WAAU,aAAV;EACA,eAAc,aAAd;EACA,mBAAkB,aAAlB;EACA,kBAAA;EACA,UAAA;;ApBxCF,OoBqKC,CArKD,KA2CC,sBAAsB,sBAAsB,YAAW;EACtD,SAAS,OAAT;;ApB5CF,OoBqKC,CArKD,KA+CC,aAEC;EACC,kBAAA;EACA,kBAAA;;ApBnDH,OoBqKC,CArKD,KA+CC,aAEC,oBAIC,kBAAiB;EAChB,cAAA;;ApBtDJ,OoBqKC,CArKD,KA+CC,aAEC,oBAQC;EACC,eAAA;EACA,kBAAA;;AAEA,OAwGH,CArKD,KA+CC,aAEC,oBAQC,gBAIE;EACA,kBAAA;EACA,SAAA;;ApB/DL,OoBqKC,CArKD,KA+CC,aAEC,oBAmBC;EACC,mBAAA;EACA,kBAAA;EACA,6BAAA;EACA,SAAA;;ApBxEJ,OoBqKC,CArKD,KA+CC,aAEC,oBA0BC;EACC,mBAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;;ApB/EJ,OoBqKC,CArKD,KA+CC,aAqCC;EACC,iBAAA;;ApBrFH,OoBqKC,CArKD,KA0FC;EACC,kBAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;;ApB9FF,OoBqKC,CArKD,KA0FC,WAMC;EACC,mBAAA;EACA,kBAAA;EACA,6BAAA;EACA,SAAA;;ApBpGH,OoBqKC,CArKD,KA0FC,WAaC,gBAAe;EACd,cAAA;;AAGD,OA0DD,CArKD,KA0FC,WAiBE,cAAe;EACf,yBAAA;EACA,WAAA;;ApB7GH,OoBqKC,CArKD,KA0FC,WAsBC;EACC,mBAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;;ApBpHH,OoBqKC,CArKD,KAyHC,YAAW,MAAO;EACjB,cAAA;;AAID,OAuCA,CArKD,KA8HE,mBAEA,aAEC;EACC,6BAAA;EACA,SAAA;;AANH,OAuCA,CArKD,KA8HE,mBAEA,aAOC,YAAW;EACV,eAAA;EACA,cAAA;;AAXH,OAuCA,CArKD,KA8HE,mBAEA,aAYC;EACC,sBAAA;EACA,kBAAA;;AAGA,OAoBH,CArKD,KA8HE,mBAEA,aAYC,oBAKE;EACA,yBAAA;EACA,WAAA;;AArBJ,OAuCA,CArKD,KA8HE,mBA2BA,aAAY,cAAe,sBAAsB;EAChD,yBAAA;EACA,WAAA;;AAEA,OAQF,CArKD,KA8HE,mBA2BA,aAAY,cAAe,sBAAsB,kBAI/C;EACA,yBAAA;EACA,WAAA;;ApB/JJ,OqByLC,CAzLD;EnBEC,QAAA;EmBEA,yBAAA;EACA,kBAAA;EACA,0CAAA;EACA,yBAAA;EACA,kBAAA;EACA,gBAAA;EACA,gBAAA;;AnBPA,OmBsLA,CAzLD,OnBGE;AACD,OmBqLA,CAzLD,OnBIE;EACA,cAAA;EACA,SAAS,EAAT;EAGA,cAAA;;AAED,OmB8KA,CAzLD,OnBWE;EACA,WAAA;;AFZF,OqByLC,CAzLD,OAYC;EACC,6BAAA;EACA,UAAA;EACA,SAAA;EACA,aAAA;;AAIE,OAqKH,CAzLD,OAYC,SAME,kBACA,GACE;EACA,eAAA;;AAEA,OAkKJ,CAzLD,OAYC,SAME,kBACA,GACE,SAGC;EACA,mBAAA;EACA,cAAA;EACA,eAAA;;AAHD,OAkKJ,CAzLD,OAYC,SAME,kBACA,GACE,SAGC,MAKA,SAAQ;EACP,0BAAA;;ArB7BP,OqByLC,CAzLD,OAYC,SAwBC;EACC,WAAA;EACA,SAAA;EACA,sBAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,mBAAA;;ArB9CH,OqByLC,CAzLD,OAYC,SAwBC,GAYC;EACC,8BAAA;EACA,+BAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,YAAA;EACA,MAAA;EACA,UAAA;;ArBxDJ,OqByLC,CAzLD,OAYC,SAwBC,GAuBC,SAAQ;EACP,8BAAA;EACA,+BAAA;EACA,eAAA;EACA,SAAS,EAAT;EACA,cAAA;EACA,kBAAA;EACA,UAAA;EACA,UAAA;;AAGD,OAmHF,CAzLD,OAYC,SAwBC,GAkCE;EACA,mBAAA;EACA,cAAA;;AAEA,OA+GH,CAzLD,OAYC,SAwBC,GAkCE,SAIC;EACA,mBAAA;EACA,eAAA;;AAFD,OA+GH,CAzLD,OAYC,SAwBC,GAkCE,SAIC,MAIA,SAAQ;EACP,+BAAA;;AATH,OAmHF,CAzLD,OAYC,SAwBC,GAkCE,SAaA,SAAQ;EACP,+BAAA;;AAGF,OAkGF,CAzLD,OAYC,SAwBC,GAmDE;EACA,mBAAA;EACA,cAAA;EACA,eAAA;;AAHD,OAkGF,CAzLD,OAYC,SAwBC,GAmDE,OAKA,SAAQ;EACP,+BAAA;;AANF,OAkGF,CAzLD,OAYC,SAwBC,GAmDE,OASA;EACC,yBAAA;;ArBjGL,OqByLC,CAzLD,OAYC,SAwBC,GAiEC;EACC,iBAAA;;ArBtGJ,OqByLC,CAzLD,OAYC,SAwBC,GAqEC;EACC,yBAAA;;ArB1GJ,OqByLC,CAzLD,OAYC,SAkGC,GAAE;EACD,0BAAA;EACA,kBAAA;;ArBhHH,OqByLC,CAzLD,OAoHC;EACC,aAAA;EACA,kBAAA;EACA,QAAA;EACA,iBAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,sBAAA;EACA,yBAAA;EACA,8BAAA;;ArB9HF,OqByLC,CAzLD,OAoHC,WAYC;EACC,iBAAA;EACA,eAAA;EACA,iBAAA;;AAIA,OAkDF,CAzLD,OAoHC,WAkBC,UACE;EACA,mBAAA;;ArBxIJ,OqByLC,CAzLD,OAoHC,WAkBC,UAKC;EACC,iBAAA;;AAKD,OAwCF,CAzLD,OAoHC,WA4BC,UACE;EACA,mBAAA;;ArBlJJ,OqByLC,CAzLD,OAoHC,WA4BC,UAKC;EACC,gBAAA;;ArBtJJ,OqByLC,CAzLD,OA2JC;EACC,6BAAA;EACA,aAAA;EACA,WAAA;EACA,WAAA;;ArB/JF,OqByLC,CAzLD,OA2JC,cAMC;EACC,aAAA;;ArBlKH,OqByLC,CAzLD,OA2JC,cAUC;EACC,cAAA;;ArBtKH,OqByLC,CAzLD,OA2JC,cAUC,UAGC,WACC;EACC,qBAAA;;AAOJ,OAQA,CAzLD,OAiLE,SACA,WAAW,uBAAsB;EAChC,aAAA;;AAFF,OAQA,CAzLD,OAiLE,SAIA,WAAW;EACV,cAAA","sourcesContent":[".fuelux {\n\n\t// Core variables, mixins, and icons\n\t@import \"variables.less\";\t// Modify this for custom colors, font-sizes, etc\n\t@import \"mixins.less\";\n\t@import \"icons.less\";\n\n\t// Fuel UX controls\n\t@import \"checkbox.less\";\n\t@import \"combobox.less\";\n\t@import \"datepicker.less\";\n\t@import \"infinite-scroll.less\";\n\t@import \"intelligent-dropdown.less\";\n\t@import \"loader.less\";\n\t@import \"misc.less\";\n\t@import \"pillbox.less\";\n\t@import \"placard.less\";\n\t@import \"radio.less\";\n\t@import \"repeater.less\";\n\t@import \"repeater-list.less\";\n\t@import \"repeater-thumbnail.less\";\n\t@import \"spinbox.less\";\n @import \"scheduler.less\";\n\t@import \"search.less\";\n\t@import \"selectlist.less\";\n\t@import \"tree.less\";\n\t@import \"wizard.less\";\n\n}\n","@charset \"UTF-8\";\n\n@font-face {\n\tfont-family: \"fuelux\";\n\tsrc:url(\"@{fueluxFontPath}fuelux.eot\");\n\tsrc:url(\"@{fueluxFontPath}fuelux.eot?#iefix\") format(\"embedded-opentype\"),\n\turl(\"@{fueluxFontPath}fuelux.woff\") format(\"woff\"),\n\turl(\"@{fueluxFontPath}fuelux.ttf\") format(\"truetype\"),\n\turl(\"@{fueluxFontPath}fuelux.svg#fuelux\") format(\"svg\");\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n//This could be an interesting addition...\n//[data-icon]:before {\n//\t.iconBaseStyles();\n//\tcontent: attr(data-icon);\n//}\n\n[class^=\"fueluxicon-\"]:before,\n[class*=\" fueluxicon-\"]:before {\n\t.iconBaseStyles();\n}\n\n.fueluxicon-loader-full:before {\n\tcontent: \"\\e000\";\n}\n\n.fueluxicon-loader-1:before {\n\tcontent: \"\\e001\";\n}\n\n.fueluxicon-loader-2:before {\n\tcontent: \"\\e002\";\n}\n\n.fueluxicon-loader-3:before {\n\tcontent: \"\\e003\";\n}\n\n.fueluxicon-loader-4:before {\n\tcontent: \"\\e004\";\n}\n\n.fueluxicon-loader-5:before {\n\tcontent: \"\\e005\";\n}\n\n.fueluxicon-loader-6:before {\n\tcontent: \"\\e006\";\n}\n\n.fueluxicon-loader-7:before {\n\tcontent: \"\\e007\";\n}\n\n.fueluxicon-loader-8:before {\n\tcontent: \"\\e008\";\n}\n\n//tree\n\n.fueluxicon-bullet:before {\n content: \"\\e009\";\n}","// For clearing floats\n.clearfix {\n\t*zoom: 1;\n\t&:before,\n\t&:after {\n\t\tdisplay: table;\n\t\tcontent: \"\";\n\t\t// Fixes Opera/contenteditable bug:\n\t\t// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952\n\t\tline-height: 0;\n\t}\n\t&:after {\n\t\tclear: both;\n\t}\n}\n\n// Single side border-radius\n.border-top-radius(@radius) {\n\tborder-top-right-radius: @radius;\n\tborder-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n\tborder-bottom-right-radius: @radius;\n \tborder-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n\tborder-bottom-right-radius: @radius;\n\tborder-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n\tborder-bottom-left-radius: @radius;\n\tborder-top-left-radius: @radius;\n}\n\n// Gradient Bar Colors for buttons and alerts\n.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {\n\tcolor: @textColor;\n\ttext-shadow: @textShadow;\n\t#gradient > .vertical(@primaryColor, @secondaryColor);\n\tborder-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);\n\tborder-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);\n}\n\n// Gradients\n#gradient {\n\t.vertical(@startColor: #555, @endColor: #333) {\n\t\tbackground-color: mix(@startColor, @endColor, 60%);\n\t\tbackground-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+\n\t\tbackground-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\n\t\tbackground-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n\t\tbackground-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10\n\t\tbackground-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10\n\t\tbackground-repeat: repeat-x;\n\t\tfilter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@startColor),argb(@endColor))); // IE9 and down\n\t}\n}\n\n// Icon Base Styles\n.iconBaseStyles(@fontFamily: \"fuelux\"){\n\tfont-family: @fontFamily !important;\n\tfont-style: normal !important;\n\tfont-weight: normal !important;\n\tfont-variant: normal !important;\n\ttext-transform: none !important;\n\tline-height: 1;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n// Opacity\n.opacity(@opacity) {\n\topacity: @opacity / 100;\n\tfilter: ~\"alpha(opacity=@{opacity})\";\n}",".checkbox {\n\n\t&.highlight {\n\t\tpadding: 4px;\n\n\t\t&.checked {\n\t\t\tbackground: #e9e9e9;\n\t\t\tborder-radius: @baseBorderRadius;\n\t\t}\n\t}\n\n\t/* for keyboard tabbing */\n\tinput[type=\"checkbox\"]:focus + .checkbox-label,\n\tinput[type=\"checkbox\"]:hover + .checkbox-label,\n\t.checkbox-label:hover {\n\t\tcolor: @grayLight;\n\t}\n\n}\n\n.checkbox-custom {\n\tposition: relative;\n\n\t&:before\n\t{\n\t\t.iconBaseStyles(\"Glyphicons Halflings\");\n\n\t\tborder: 1px solid #adadad;\n\t\tborder-radius: @baseBorderRadius;\n\t\tcolor: #fff;\n\t\tcontent: \" \";\n\t\tfont-size: 9px;\n\t\theight: 14px;\n\t\tleft: 0px;\n\t\tpadding: 1px 0 0 1px;\n\t\tposition: absolute;\n\t\ttop: 3px;\n\t\twidth: 14px;\n\t}\n\n\t&.checked {\n\t\t&:before {\n\t\t\tbackground: #39b3d7;\n\t\t\tborder-color: #39b3d7;\n\t\t\tcontent: \"\\e013\";\n\t\t}\n\t}\n\n\t&.disabled {\n\t\tcursor: not-allowed;\n\n\t\t&:before\n\t\t{\n\t\t\tcursor: not-allowed;\n\t\t\topacity: .5;\n\t\t}\n\t}\n\n\t&.checkbox-inline {\n\t\t&:before {\n\t\t\tleft: 0;\n\t\t\ttop: 3px;\n\t\t}\n\n\t\t&.highlight {\n\t\t\tpadding: 4px 4px 4px 24px;\n\n\t\t\t&:before {\n\t\t\t\tleft: 4px;\n\t\t\t\ttop: 7px;\n\t\t\t}\n\n\t\t\t&.checked {\n\t\t\t\tbackground: #e9e9e9;\n\t\t\t\tborder-radius: @baseBorderRadius;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* for keyboard tabbing */\n\tinput[type=\"checkbox\"]:focus + .checkbox-label {\n\t\tcolor: @grayLight;\n\t}\n\n}",".combobox {\n\t&.disabled {\n\t\t.input-group-btn {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n}",".datepicker {\n\n\t&-calendar {\n\t\tpadding: 16px 16px 0;\n\t\tmin-height: 262px;\n\n\t\tbutton {\n\t\t\tborder: 0;\n\t\t\tpadding: 0;\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t&-days {\n\t\t\theight: 182px;\n\t\t\tmargin: 10px 0 12px;\n\t\t\twidth: 100%;\n\n\t\t\tthead {\n\t\t\t\tborder-bottom: 1px solid #cccaca;\n\t\t\t}\n\n\t\t\t/* for spacing */\n\t\t\ttbody:before {\n\t\t\t\tline-height:3px;\n\t\t\t\tcontent:\"\\200C\";\n\t\t\t\tdisplay:block;\n\t\t\t}\n\n\t\t\ttd, th {\n\t\t\t\tfont-size: 14px;\n\t\t\t\theight: 32px;\n\t\t\t\ttext-align: center;\n\t\t\t\tvertical-align: middle;\n\t\t\t\twidth: 14.29%;\n\t\t\t}\n\n\t\t\ttd {\n\t\t\t\tbutton {\n\t\t\t\t\tcolor: #231f20;\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\theight: 30px;\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\twidth: 30px;\n\t\t\t\t}\n\n\t\t\t\tspan {\n\t\t\t\t\tdisplay: block;\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tbackground: #b7e3f8;\n\t\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.current-day {\n\t\t\t\t\tbutton {\n\t\t\t\t\t\tborder: 1px solid #1d75bb;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.last-month, &.next-month {\n\t\t\t\t\tbackground: #e3e2e1;\n\t\t\t\t}\n\n\t\t\t\t&.past {\n\t\t\t\t\tbutton {\n\t\t\t\t\t\tcolor: #8d8787;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.restricted {\n\t\t\t\t\tbutton {\n\t\t\t\t\t\tcursor: no-drop;\n\t\t\t\t\t\tposition: relative;\n\n\t\t\t\t\t\t&:before {\n\t\t\t\t\t\t\tborder-top: 1px solid #a94442;\n\t\t\t\t\t\t\tbottom: 0;\n\t\t\t\t\t\t\tcontent: \" \";\n\t\t\t\t\t\t\tdisplay: block;\n\t\t\t\t\t\t\tleft: 5px;\n\t\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\t\tright: 5px;\n\t\t\t\t\t\t\ttop: 50%;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\tbackground: none;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.selected {\n\t\t\t\t\tspan {\n\t\t\t\t\t\tbackground: #1d75bb;\n\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\tbackground: #0f5f9f;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbutton {\n\t\t\t\t\t\tcolor: #fff;\n\t\t\t\t\t}\n\n\t\t\t\t\t&.current-day {\n\t\t\t\t\t\tbox-shadow: 0 0 0 1px #fff offset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tth {\n\t\t\t\tfont-weight: bold;\n\t\t\t\theight: 22px;\n\t\t\t\tvertical-align: top;\n\t\t\t}\n\t\t}\n\n\t\t&-header {\n\t\t\t.clearfix;\n\n\t\t\tbutton {\n\t\t\t\tborder: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\tbackground-color: transparent;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tmargin: 0 auto;\n\t\t\t\ttext-align: center;\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 174px;\n\t\t\t\tcolor: #4d4d4f;\n\t\t\t\tfont-size: 20px;\n\t\t\t\tline-height: 30px;\n\t\t\t\ttext-decoration: underline;\n\t\t\t\tvertical-align: middle;\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tcolor: #1d75bb;\n\t\t\t\t\t\ttext-decoration: underline;\n\t\t\t\t\t}\n\n\t\t\t\t\t&.disabled {\n\t\t\t\t\t\tcursor: default;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\t}\n\n\t\t\t\t\t.month {\n\t\t\t\t\t\tdisplay: inline;\n\t\t\t\t\t\tmargin: 0;\n\t\t\t\t\t\tpadding: 0;\n\n\t\t\t\t\t\tspan {\n\t\t\t\t\t\t\tdisplay: none;\n\n\t\t\t\t\t\t\t&.current {\n\t\t\t\t\t\t\t\tdisplay: inline;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t.next, .prev {\n\t\t\t\tbackground: #666669;\n\t\t\t\tbackground-clip: padding-box;\n\t\t\t\tborder-radius: 30px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tfloat: left;\n\t\t\t\theight: 30px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 30px;\n\n\t\t\t\tspan.glyphicon {\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t\tfont-size: 16px;\n\t\t\t\t\tline-height: 30px;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: #1d75bb;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.next {\n\t\t\t\tfloat: right;\n\n\t\t\t\tspan.glyphicon {\n\t\t\t\t\tline-height: 28px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&-footer {\n\t\t\tbackground: #e3e2e1;\n\t\t\tbackground-clip: padding-box;\n\t\t\tborder-radius: 0 0 4px 4px;\n\t\t\tborder-top: 1px solid #cccaca;\n\t\t\theight: 30px;\n\t\t\tmargin: 0 -16px;\n\t\t\tpadding: 4px 14px;\n\n\t\t\t.datepicker-today {\n\t\t\t\tcolor: #231f20;\n\t\t\t\tfont-size: 14px;\n\t\t\t\ttext-decoration: underline;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: #1b75bb;\n\t\t\t\t\ttext-decoration: underline;\n\t\t\t\t}\n\n\t\t\t\t&.disabled {\n\t\t\t\t\tcolor: #8b8c8e;\n\t\t\t\t\tcursor: default;\n\t\t\t\t\tpointer-events: none;\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tcolor: #8b8c8e\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&-calendar-wrapper {\n\t\tborder: 1px solid #6e6f71;\n\t\tmin-height: 20px;\n\t\tpadding: 0;\n\t\twidth: 300px;\n\t}\n\n\t&-wheels {\n\t\tdisplay: none;\n\n\t\tul button {\n\t\t\tborder: 0;\n\t\t\tpadding: 0;\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t&-footer {\n\t\t\tbackground: #e3e2e1;\n\t\t\tborder-radius: 0 0 4px 4px;\n\t\t\tborder-top: 1px solid #cccaca;\n\t\t\tclear: both;\n\n\t\t\t.datepicker-wheels-back {\n\t\t\t\tdisplay: block;\n\t\t\t\tcolor: #4d4d4f;\n\t\t\t\tfloat: left;\n\t\t\t\tline-height: 22px;\n\t\t\t\tborder: 0;\n\t\t\t\tbackground-color: transparent;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: #1d75bb;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.datepicker-wheels-select {\n\t\t\t\tfloat: right;\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tcolor: @blue;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: #1d75bb;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&-month, &-year {\n\t\t\tfloat: left;\n\t\t\twidth: 50%;\n\n\t\t\tul {\n\t\t\t\theight: 217px;\n\t\t\t\tlist-style-type: none;\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: auto;\n\t\t\t\tpadding: 0;\n\t\t\t\ttext-align: center;\n\n\t\t\t\tli {\n\t\t\t\t\tmargin: 4px 0;\n\n\t\t\t\t\tbutton {\n\t\t\t\t\t\tdisplay: block;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\tcolor: #414041;\n\t\t\t\t\t\tdisplay: block;\n\t\t\t\t\t\tfont-size: 16px;\n\t\t\t\t\t\tline-height: 24px;\n\t\t\t\t\t\ttext-decoration: none;\n\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\tbackground: #aee0f8;\n\t\t\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t&.selected {\n\t\t\t\t\t\tbutton {\n\t\t\t\t\t\t\tbackground: #1d75bb;\n\t\t\t\t\t\t\tcolor: #fff;\n\n\t\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\t\tbackground: #0f5f9f;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.header {\n\t\t\t\tbackground: #e3e2e1;\n\t\t\t\tbackground-clip: padding-box;\n\t\t\t\tborder-bottom: 1px solid #cccaca;\n\t\t\t\tborder-radius: 4px 0 0 0;\n\t\t\t\tcolor: #4d4d4f;\n\t\t\t\tfont-size: 20px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tline-height: 30px;\n\t\t\t\tmargin-top: 0;\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t&.full {\n\t\t\t\tborder-left: 0;\n\t\t\t\twidth: 100%;\n\n\t\t\t\t.header {\n\t\t\t\t\tborder-radius: 4px 4px 0 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&-year {\n\t\t\tborder-left: 1px solid #cccaca;\n\t\t\tfloat: right;\n\n\t\t\t.header {\n\t\t\t\tborder-radius: 0 4px 0 0;\n\t\t\t}\n\t\t}\n\t}\n}\n",".infinitescroll {\n\toverflow-y: auto;\n\n\t.infinitescroll-end {\n\t\tclear: both;\n\t\tfont-style: italic;\n\t\tpadding: 6px;\n\t\ttext-align: center;\n\t}\n\n\t.infinitescroll-load {\n\t\tclear: both;\n\t\tpadding: 6px;\n\n\t\tbutton {\n\t\t\tpadding: 5px 12px;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.loader {\n\t\t\tfont-size: 32px;\n\t\t\theight: 32px;\n\t\t\tmargin: 0 auto;\n\t\t\twidth: 32px;\n\t\t}\n\t}\n}",".dropUp {\n\t-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);\n\t-moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 0 10px rgba(0, 0, 0, 0.2);\n}",".loader {\n height: 64px;\n font-size: 64px;\n position: relative;\n width: 64px;\n\n\t&:after, &:before {\n\t\t.iconBaseStyles();\n\n\t\tbottom: 0;\n\t\tdisplay: block;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 0;\n\t}\n\n\t&:before {\n\t\tcontent: '\\e000';\n\t\topacity: 0.33;\n\t}\n\n\t&.iefix:before{\n\t\tcolor: #bcbcbc;\n\t\topacity: 1;\n\t}\n\n\t&[data-frame=\"1\"]:after {\n\t\tcontent: '\\e001';\n\t}\n\n\t&[data-frame=\"2\"]:after {\n\t\tcontent: '\\e002';\n\t}\n\n\t&[data-frame=\"3\"]:after {\n\t\tcontent: '\\e003';\n\t}\n\n\t&[data-frame=\"4\"]:after {\n\t\tcontent: '\\e004';\n\t}\n\n\t&[data-frame=\"5\"]:after {\n\t\tcontent: '\\e005';\n\t}\n\n\t&[data-frame=\"6\"]:after {\n\t\tcontent: '\\e006';\n\t}\n\n\t&[data-frame=\"7\"]:after {\n\t\tcontent: '\\e007';\n\t}\n\n\t&[data-frame=\"8\"]:after {\n\t\tcontent: '\\e008';\n\t}\n}","input, textarea {\n\t&.glass {\n\t\tbackground: transparent;\n\t\tborder: 1px solid #fff;\n\t\tbox-shadow: none;\n\n\t\t&:hover {\n\t\t\tbackground: #d9edf7;\n\t\t\tborder-color: #66afe9;\n\t\t\tcursor: pointer;\n\n\t\t\t&[disabled] {\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder-color: #fff;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\t\t}\n\n\t\t&:focus {\n\t\t\tbackground: #fff;\n\t\t\tborder-color: #66afe9;\n\t\t\tbox-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102,175,233,.6);\n\t\t\tcursor: auto;\n\n\t\t\t&[disabled] {\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder-color: #fff;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\t\t}\n\n\t\t&[disabled] {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n}\n\n// makes radios and checkboxes that use Bootstrap button plugin accessible (tabbable) \n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n\tdisplay:inline;\n\tposition:absolute;\n\tleft:-9999px;\n}",".pillbox {\n\tborder: 1px solid #BBBBBB;\n\tborder-radius: 4px;\n\tcursor: text;\n\tpadding: 3px;\n\n\t&[data-readonly] {\n\t\tborder: 1px solid transparent;\n\n\t\t&.truncate {\n\t\t\t.pillbox-input-wrap {\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.truncated {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.pillbox-more {\n\t\t\t\tdisplay: inline;\n\t\t\t}\n\t\t}\n\n\t\t.pill {\n\t\t\tspan.glyphicon-close {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t.pillbox-add-item {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t.pillbox-input-wrap {\n\t\t\tdisplay: none;\n\n\t\t\tbutton.dropdown-toggle {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.pills-editable {\n\t\t.pill-group {\n\t\t\t.pill {\n\t\t\t\tspan {\n\t\t\t\t\tcursor: text;\n\n\t\t\t\t\t&.glyphicon-close {\n\t\t\t\t\t\tcursor: pointer;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t> .pill-group {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\twidth: 100%;\n\n\t\t> .pill {\n\t\t\tmargin: 2px;\n\t\t\tcursor: default;\n\t\t\tfloat:left;\n\t\t\tword-break: break-all;\n\n\t\t\t&.pillbox-highlight {\n\t\t\t\toutline: 1px dotted @grayLight;\n\t\t\t}\n\n\t\t\t&.truncated {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.pillbox-list-edit {\n\t\t\t\tborder: none;\n\t\t\t\tcolor: @grayDark;\n\t\t\t\tfont-weight: normal;\n\t\t\t\tborder-radius: 2px;\n\n\t\t\t\t&:focus {\n\t\t\t\t\toutline: none;\n\t\t\t\t\tborder: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.glyphicon-close {\n\t\t\t\tcursor: pointer;\n\t\t\t\ttop: -1px;\n\t\t\t\tleft: 2px;\n\n\t\t\t\t&:before {\n\t\t\t\t\tcontent: \" \\00d7\";\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\topacity: .4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\t.pillbox-input-wrap {\n\t\tposition: relative;\n\t\tmargin: 4px 0 3px 3px;\n\t\tfloat: left;\n\n\t\t&.editing {\n\t\t\tborder: 1px solid #ccc;\n\t\t\tborder-radius: 4px;\n\t\t\tmargin: 2px 0 3px 3px;\n\n\t\t\tinput.pillbox-add-item {\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tcolor: #333;\n\t\t\t\theight: 32px;\n\t\t\t}\n\t\t}\n\t}\n\n\t.pillbox-add-item {\n\t\tborder: none;\n\t\tbox-shadow: none;\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t\tborder: none;\n\t\t}\n\t}\n\n\t.pillbox-more {\n\t\tcursor: pointer;\n\t\tdisplay: none;\n\t\tline-height: 30px;\n\t}\n\n\t.suggest {\n\t\tmax-height: 166px; // arbitrary number\n\t\toverflow-y: auto;\n\n\t\t> li {\n\t\t\twhite-space: nowrap;\n\t\t\tcursor: pointer;\n\t\t\tpadding: 3px 20px;\n\n\t\t\t&.pillbox-suggest-sel {\n\t\t\t\tbackground-color: @grayLighter;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: @grayLighter;\n\t\t\t}\n\t\t}\n\t}\n}\n",".placard {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t&[data-ellipsis=\"true\"] {\n\t\t&.showing {\n\t\t\tinput.placard-field {\n\t\t\t\toverflow: visible;\n\t\t\t\ttext-overflow: clip;\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\tinput.placard-field {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\ttextarea.placard-field {\n\t\t\t&[readonly] {\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.showing {\n\t\t.placard-footer,\n\t\t.placard-header,\n\t\t.placard-popup {\n\t\t\tdisplay: block;\n\t\t\tz-index: 1;\n\t\t}\n\n\t\tinput.placard-field, textarea.placard-field {\n\t\t\tbackground: #fff;\n\t\t\tborder: 1px solid #CCCCCC;\n\t\t\tbox-shadow: none;\n\t\t\tposition: relative;\n\t\t\tz-index: 1;\n\t\t}\n\t}\n\n\tinput.placard-field, textarea.placard-field {\n\t\tresize: none;\n\n\t\t&[readonly] {\n\t\t\tbackground: #fff;\n\t\t\tcursor: auto;\n\n\t\t\t&.glass {\n\t\t\t\tbackground: none;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: #d9edf7;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&:focus {\n\t\t\tborder: 1px solid #CCCCCC;\n\t\t\tbox-shadow: none;\n\t\t}\n\t}\n\n\t&-cancel {\n\t\tfont-size: 12px;\n\t\tmargin-right: 4px;\n\t\tvertical-align: middle;\n\t}\n\n\t&-footer,\n\t&-header {\n\t\tdisplay: none;\n\t\tleft: 0;\n\t\tline-height: 1;\n\t\tposition: absolute;\n\t\tright: 0;\n\t}\n\n\t&-footer {\n\t\tpadding: 4px 0 8px 0;\n\t\ttext-align: right;\n\t\ttop: 100%;\n\t}\n\n\t&-header {\n\t\tbottom: 100%;\n\t\tpadding: 8px 0 4px 0;\n\n\t\th1, h2, h3, h4, h5, h6 {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t&-popup {\n\t\tbackground: #d9edf7;\n\t\tbackground-clip: padding-box;\n\t\tborder: 1px solid #ccc;\n\t\tborder-radius: 4px;\n\t\tbottom: -8px;\n\t\tbox-shadow: 0 0 0 1px #fff inset;\n\t\tdisplay: none;\n\t\tleft: -8px;\n\t\tposition: absolute;\n\t\tright: -8px;\n\t\ttop: -8px;\n\t}\n}\n",".radio {\n\t&.highlight {\n\t\tpadding: 4px;\n\n\t\t&.checked {\n\t\t\tbackground: #e9e9e9;\n\t\t\tborder-radius: @baseBorderRadius;\n\t\t}\n\t}\n\n\t/* for keyboard tabbing */\n\tinput[type=\"radio\"]:focus + .radio-label,\n\tinput[type=\"radio\"]:hover + .radio-label,\n\t.radio-label:hover {\n\t\tcolor: @grayLight;\n\t}\n\n}\n\n.radio-custom {\n\tposition: relative;\n\n\t&:after {\n\t\tbackground: transparent;\n\t\tborder-radius: 6px;\n\t\tcontent: \" \";\n\t\theight: 6px;\n\t\tleft: 4px;\n\t\tposition: absolute;\n\t\ttop: 7px;\n\t\twidth: 6px;\n\t}\n\n\t&:before\n\t{\n\t\tborder: 1px solid #adadad;\n\t\tborder-radius: 14px;\n\t\tcontent: \" \";\n\t\theight: 14px;\n\t\tleft: 0px;\n\t\tposition: absolute;\n\t\ttop: 3px;\n\t\twidth: 14px;\n\t}\n\n\t&.checked {\n\t\t&:after {\n\t\t\tbackground: #fff;\n\t\t}\n\n\t\t&:before {\n\t\t\tbackground: #39b3d7;\n\t\t\tborder-color: #39b3d7;\n\t\t}\n\t}\n\n\t&.disabled {\n\t\tcursor: not-allowed;\n\n\t\t&:after {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t\t\n\t\t&:before {\n\t\t\tcursor: not-allowed;\n\t\t\topacity: .5;\n\t\t}\n\t}\n\n\t&.radio-inline {\n\t\t&:after {\n\t\t\tleft: 4px;\n\t\t\ttop: 7px;\n\t\t}\n\n\t\t&:before {\n\t\t\tleft: 0;\n\t\t\ttop: 3px;\n\t\t}\n\n\t\t&.highlight {\n\t\t\tpadding: 4px 4px 4px 24px;\n\n\t\t\t&:after {\n\t\t\t\tleft: 8px;\n\t\t\t\ttop: 11px;\n\t\t\t}\n\n\t\t\t&:before {\n\t\t\t\tleft: 4px;\n\t\t\t\ttop: 7px;\n\t\t\t}\n\n\t\t\t&.checked {\n\t\t\t\tbackground: #e9e9e9;\n\t\t\t\tborder-radius: @baseBorderRadius;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* for keyboard tabbing */\n\tinput[type=\"radio\"]:focus + .radio-label {\n\t\tcolor: @grayLight;\n\t}\n\n}\n",".repeater {\n\tborder: 1px solid #ddd;\n\tborder-radius: 4px;\n\n\t&-canvas {\n\t\t&.scrolling{\n\t\t\tbottom: 0;\n\t\t\tleft: 0;\n\t\t\toverflow-y: auto;\n\t\t\tposition: absolute;\n\t\t\tright: 0;\n\t\t\ttop: 0;\n\t\t}\n\t}\n\n\t&-header,\n\t&-footer\n\t{\n\t\tbackground: #f9f9f9;\n\t\tmin-height: 50px;\n\t\tpadding: 8px;\n\t\t.clearfix;\n\n\t\t&-left {\n\t\t\tfloat: left;\n\t\t}\n\n\t\t&-right {\n\t\t\tfloat: right;\n\t\t}\n\n\t\t@media (max-width: 625px) {\n\t\t\t&-left,\n\t\t\t&-right {\n\t\t\t\tfloat: none;\n\t\t\t\t.clearfix;\n\t\t\t}\n\n\t\t\t&-left {\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&-header {\n\t\tborder-bottom: 1px solid #ddd;\n\t\t.border-top-radius(4px);\n\t}\n\n\t&-footer {\n\t\tborder-top: 1px solid #ddd;\n\t\t.border-bottom-radius(4px);\n\t}\n\n\t&-loader {\n\t\tdisplay: none;\n\t\tleft: 50%;\n\t\tposition: absolute;\n\t\tmargin: -32px 0 0 -32px;\n\t\ttop: 50%;\n\t}\n\n\t&-viewport {\n\t\tmin-height: 80px;\n\t\tposition: relative;\n\t}\n\n\t&-pagination {\n\n\t\tlabel {\n\t\t\tfont-weight: normal;\n\t\t}\n\n\t\t.repeater-primaryPaging {\n\t\t\tdisplay: none;\n\t\t\tvertical-align: middle;\n\t\t\twidth: 116px;\n\n\t\t\t&.active {\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\n\t\t\tul.dropdown-menu {\n\t\t\t\tmin-width: 116px;\n\t\t\t}\n\t\t}\n\n\t\t.repeater-secondaryPaging {\n\t\t\tdisplay: none;\n\t\t\twidth: 82px;\n\n\t\t\t&.active {\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\t\t}\n\t}\n\n\t&-search {\n\t\tfloat: left;\n\t\twidth: 200px;\n\t}\n\n\t&-title {\n\t\tdisplay: block;\n\t\tfloat: left;\n\t\tline-height: 34px;\n\t\tmargin-right: 10px;\n\t}\n}",".repeater[data-currentview=\"list\"] {\n\t.repeater-loader {\n\t\tmargin-top: -12px;\n\n\t\t&.noHeader {\n\t\t\tmargin-top: -32px;\n\t\t}\n\t}\n}\n\n.repeater-list {\n\t&-check {\n\t\tdisplay: inline-block;\n\t\theight: 0;\n\t\tline-height: 0;\n\t\tposition: relative;\n\t\tvertical-align: top;\n\t\twidth: 0;\n\n\t\tspan.glyphicon {\n\t\t\tleft: -22px;\n\t\t\tposition: absolute;\n\t\t\ttop: 2px;\n\t\t}\n\t}\n\n\t&-header,\n\t&-items {\n\t\tmargin-bottom: 0;\n\t\twidth: 100%;\n\n\t\ttd {\n\t\t\tborder-bottom: 1px solid #ddd;\n\t\t\tborder-left: 1px solid #ddd;\n\t\t\tborder-top: none;\n\n\t\t\t&:first-child {\n\t\t\t\tborder-left: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&-header {\n\t\tbackground: #F9F9F9;\n\n\t\ttd {\n\t\t\tfont-weight: bold;\n\n\t\t\t&.sortable {\n\t\t\t\t&:hover,\n\t\t\t\t&.sorted\n\t\t\t\t{\n\t\t\t\t\tbackground: #F1F1F1;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\t#gradient > .vertical(@startColor: #F9F9F9; @endColor: #E5E5E5);\n\t\t\t\t}\n\n\t\t\t\t&.sorted {\n\t\t\t\t\tspan.glyphicon {\n\t\t\t\t\t\tdisplay: block;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tspan.glyphicon {\n\t\t\t\tdisplay: none;\n\t\t\t\tfloat: right;\n\t\t\t\tmargin-top: 2px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&-items {\n\t\ttr {\n\t\t\t&.empty {\n\t\t\t\ttd {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t\tfont-style: italic;\n\t\t\t\t\tpadding: 20px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.selectable{\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: #d9edf7;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.selected {\n\t\t\t\tbackground: #66AFE9;\n\t\t\t\tcolor: #fff;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: #428bca;\n\t\t\t\t}\n\n\t\t\t\ttd:first-child {\n\t\t\t\t\tpadding-left: 30px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&-wrapper {\n\t\toverflow-y: auto;\n\t}\n}",".repeater-thumbnail {\n\tborder: 1px solid #ddd;\n\tcolor: #666;\n\tfloat: left;\n\tfont-size: 12px;\n\theight: 130px;\n\tline-height: 36px;\n\tmargin: 10px 12px;\n\ttext-align: center;\n\twidth: 100px;\n\n\t-webkit-box-shadow: 0 1px 4px 0 #ddd;\n\tbox-shadow: 0 1px 4px 0 #ddd;\n\n\timg {\n\t\tdisplay: block;\n\t\tmargin-top: 12px;\n\t}\n\n\t&-cont {\n\t\theight: 100%;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\twidth: 100%;\n\n\t\tdiv.empty {\n\t\t\tfont-style: italic;\n\t\t\tpadding: 20px 10px;\n\t\t\ttext-align: center;\n\t\t}\n\t}\n}",".spinbox {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t&.digits-3 {\n\t\twidth: 60px;\n\t}\n\n\t&.disabled {\n\t\t.spinbox-buttons {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.spinbox-input {\n\t\tfloat: left;\n\t\tpadding-bottom: 3px; /* Magic number */\n\t\tpadding: 0px 25px 0px 7px;\n\t}\n\n\t.btn {\n\t\tposition: relative;\n\t\twidth: 20px;\n\t\theight: 13px;\n\t\tpadding-top: 0;\n\t\tpadding-right: 9px;\n\t\tpadding-left: 9px;\n\n\t\t&.disabled {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.spinbox-buttons {\n\t\tposition: absolute;\n\t\theight: 28px;\n\t\twidth: 20px;\n\t\tright: 2px;\n\t}\n\n\t.spinbox-up {\n\t\tpadding: 0 0 14px 1px;\n\t\ttop: 2px;\n\n\t\t.glyphicon-chevron-up {\n\t\t\tposition:relative;\n\t\t\ttop: 0px;\n\t\t}\n\t}\n\n\t// fix radius from BS btn-group\n\t.btn-group > .btn.spinbox-up {\n\t\tborder-top-right-radius: 4px;\n\t}\n\n\t.spinbox-down {\n\t\tpadding: 0 0 8px 1px;\n\t\ttop: 2px;\n\t\theight: 15px;\n\t\tborder-bottom-left-radius: 4px;\n\n\t\t.glyphicon-chevron-down {\n\t\t\tposition: relative;\n\t\t\tleft: -1px;\n\t\t\ttop: 0px;\n\t\t}\n\t}\n}",".scheduler {\n\n\t.control-label {\n\t\tmin-width: 7em;\n\t}\n\n\t.inline-form-text {\n\t\tfloat: left;\n\t\tline-height: 27px;\n\t\tmargin-top:4px;\n\t}\n\n\t/* -------------------------------\n\tSTART DATE/TIME\n------------------------------- */\n\n\t.start-datetime {\n\n\t\t&.form-group {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t.form-group {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t.combobox {\n\t\t\tmax-width: 9em;\n\n\t\t\t.dropdown-menu {\n\t\t\t\tmax-height: 200px;\n\t\t\t\toverflow: auto;\n\t\t\t}\n\n\t\t}\n\n\t\t.dropdown {\n\t\t\tfloat: left;\n\t\t\tmargin: 0 10px 0 0;\n\t\t}\n\n\t}\n\n\t/* -------------------------------\n\tTIMEZONE\n------------------------------- */\n\n\t.timezone-container {\n\t\t.input-group {\n\t\t\tmax-width: 20em;\n\t\t}\n\n\t\t.dropdown-label {\n\t\t\theight: 18px;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 20em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t.dropdown-menu {\n\t\t\tmax-height: 200px;\n\t\t\toverflow: auto;\n\t\t}\n\n\t}\n\n/* -------------------------------\n\tREPEAT PANELS\n------------------------------- */\n\n\t.repeat-panel {\n\t\tmargin-left: 0;\n\n\t\tlabel {\n\t\t\tfont-weight: normal;\n\t\t}\n\t\t\n\t\t.radio {\n\t\t\tmargin-right: 10px;\n\t\t}\n\n\t\t.form-group {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t}\n\n// EVERY\n\n\t.repeat-interval {\n\t\tmargin-left: 0;\n\n\t\t.clearfix;\n\n\t\t.form-group {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t.dropdown-menu {\n\t\t\tmax-height: 200px;\n\t\t\toverflow: auto;\n\t\t}\n\n\t\t.repeat-every-panel {\n\t\t\tfloat: left;\n\n\t\t\t.repeat-every-pretext {\n\t\t\t\tpadding: 0 10px;\n\t\t\t}\n\n\t\t\t.spinbox {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-right: 10px;\n\n\t\t\t\tinput {\n\t\t\t\t\tmargin-bottom: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// MONTHLY\n\n\t\t.repeat-monthly {\n\n\t\t\t.repeat-monthly-date {\n\t\t\t\tmargin-top: 10px;\n\t\t\t\t.clearfix;\n\n\t\t\t\t.selectlist {\n\t\t\t\t\tmargin-left: 5px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.repeat-monthly-day {\n\t\t\t\tmargin-top: 10px;\n\t\t\t\t.clearfix;\n\t\t\t}\n\n\t\t\t.month-days {\n\t\t\t\tmargin-left: 10px;\n\t\t\t}\n\n\t\t}\n\n// YEARLY\n\n\t\t.repeat-yearly {\n\n\t\t\t.repeat-yearly-date {\n\t\t\t\tmargin-top: 10px;\n\t\t\t\t.clearfix;\n\n\t\t\t\t.year-month-day {\n\t\t\t\t\tmargin-left: 10px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.year-month-days {\n\t\t\t\tmargin-left: 10px;\n\t\t\t}\n\n\t\t\t.year-month {\n\t\t\t\tmargin-left: 10px;\n\n\t\t\t}\n\n\t\t\t.repeat-yearly-day {\n\t\t\t\tmargin-top: 10px;\n\t\t\t\t.clearfix;\n\n\t\t\t\t.repeat-yearly-day-text {\n\t\t\t\t\tmargin-left: 10px;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n// WEEKLY\n\n\t\t.repeat-weekly {\n\n\t\t\tbutton:not(.active) {\n\t\t\t\tbackground-color: #fff;\n\t\t\t}\n\n\t\t\t.btn-group {\n\t\t\t\t&.disabled {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\topacity: 0.65;\n\n\t\t\t\t\t&:before {\n\t\t\t\t\t\tbackground: transparent;\n\t\t\t\t\t\tbottom: 0;\n\t\t\t\t\t\tcontent: \"\";\n\t\t\t\t\t\tleft: 0;\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tright: 0;\n\t\t\t\t\t\ttop: 0;\n\t\t\t\t\t\tz-index: 5;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.selectlist {\n\t\t\tfloat: left;\n\t\t}\n\n\t\tlabel.radio {\n\t\t\tfloat: left;\n\t\t\tline-height: 27px;\n\n\t\t\tinput {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\t\t}\n\n/* -------------------------------\nEND\n------------------------------- */\n\n\t.repeat-end {\n\n\t\t.end-after {\n\t\t\tfloat: left;\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-right: 10px;\n\t\t}\n\t\t\n\t\t.form-group {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t.end-option-panel {\n\n\t\t}\n\n\t}\n\n\n}",".search {\n\t&.disabled {\n\t\t.input-group-btn {\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n}",".selectlist {\n\n\t&.disabled {\n\t\tcursor: not-allowed;\n\t}\n\n\t&-sizer {\n\t\tdisplay: inline-block;\n\t\tposition: absolute;\n\t\tvisibility: hidden;\n\t\ttop: 0;\n\t}\n\n\t.selected-label {\n\t\toverflow: hidden;\t// helps with text flow on small screens\n\t\tmin-width: 2em;\n\t}\n\n\t.btn.dropdown-toggle {\n\t\twhite-space: normal;\n\n\t\t.selected-label {\n\t\t\tpadding-right: 10px;\n\t\t\ttext-align: left;\n\t\t}\n\t}\n}",".tree {\n\tborder: 1px solid @grayLight;\n\tborder-radius: 4px 4px 4px 4px;\n\tpadding: 10px 15px 0 15px;\n\toverflow-x: auto;\n\toverflow-y: auto;\n\tposition: relative;\n\tlist-style: none;\n\n\t*:focus {\n\t\toutline: none;\n\t}\n\n\tbutton:focus {\n\t\tcolor: @treeHoverText;\n\t}\n\n\tul {\n\t\tpadding-left: 0;\n\t\tmargin-top: 0;\n\t\tmargin-bottom: 0;\n\t\tlist-style: none;\n\t}\n\n\tli {\n\t\tmargin: 0;\n\t\tmargin-top: 5px;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t.tree-loader {\n\t\t// make even with tree-branch-children\n\t\tmargin-left: 45px;\n\t}\n\n\t.tree-open > .tree-branch-header .glyphicon-play {\n\t\ttransform:rotate(90deg);\n\t\t-ms-transform:rotate(90deg);\n\t\t-webkit-transform:rotate(90deg);\n\t\tposition: relative;\n\t\tleft: -5px;\n\t}\n\n\t[data-children=false] > .tree-branch-header .icon-caret:before {\n\t\tcontent: '\\00a0'; //space\n\t}\n\n\t.tree-branch {\n\n\t\t.tree-branch-header {\n\t\t\tposition: relative;\n\t\t\tborder-radius: 6px;\n\n\t\t\t.tree-branch-name:hover {\n\t\t\t\tcolor: @treeHoverText;\n\t\t\t}\n\n\t\t\t.glyphicon-play {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tpadding-right: 5px;\n\n\t\t\t\t&:before {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\ttop: -2px;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t.tree-branch-name {\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tborder: 0;\n\t\t\t}\n\n\t\t\tlabel {\n\t\t\t\tfont-weight: normal;\n\t\t\t\tpadding-left: 3px;\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t}\n\n\t\t.tree-branch-children {\n\t\t\tmargin-left: 14px;\n\t\t}\n\n\t}\n\n\t.tree-item {\n\t\tposition: relative;\n\t\tcursor: pointer;\n\t\tborder-radius: 6px;\n\t\tmargin-left: 26px;\n\n\t\t.tree-item-name {\n\t\t\twhite-space: nowrap;\n\t\t\tborder-radius: 6px;\n\t\t\tbackground-color: transparent;\n\t\t\tborder: 0;\n\t\t}\n\n\t\t.tree-item-name:hover {\n\t\t\tcolor: @treeHoverText;\n\t\t}\n\n\t\t&.tree-selected .tree-item-name {\n\t\t\tbackground-color: @treeSelectBackground;\n\t\t\tcolor: #fff;\n\t\t}\n\n\t\tlabel {\n\t\t\tfont-weight: normal;\n\t\t\tpadding-left: 7px;\n\t\t\tmargin-bottom: 0;\n\t\t\tcursor: pointer;\n\t\t}\n\n\t}\n\n\t.icon-caret:hover + .tree-branch-name {\n\t\tcolor: @treeHoverText;\n\t}\n\n\t// folder selectable\n\t&.tree-folder-select {\n\n\t\t.tree-branch {\n\n\t\t\t.icon-caret {\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tborder: 0;\n\t\t\t}\n\n\t\t\t.icon-caret:hover {\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: @treeHoverText;\n\t\t\t}\n\n\t\t\t> .tree-branch-name {\n\t\t\t\tpadding: 1px 5px 0 5px;\n\t\t\t\tborder-radius: 6px;\n\n\n\t\t\t\t&.tree-selected {\n\t\t\t\t\tbackground-color: @treeSelectBackground;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t.tree-branch.tree-selected > .tree-branch-header .tree-branch-name {\n\t\t\tbackground-color: @treeSelectBackground;\n\t\t\tcolor: #fff;\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: @treeSelectBackground;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\t\t}\n\n\t}\n\n}",".wizard {\n\n\t.clearfix;\n\n\tborder: 1px solid @navbarBorder;\n\tborder-radius: @baseBorderRadius;\n\tbox-shadow: 0 1px 4px rgba(0,0,0,.065);\n\tbackground-color: @tableBackgroundAccent;\n\tposition: relative;\n\tmin-height: 48px;\n\toverflow: hidden;\n\n\t> .steps {\n\t\tlist-style: none outside none;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\twidth: 4000px;\n\n\t\t&.previous-disabled {\n\t\t\tli {\n\t\t\t\t&.complete {\n\t\t\t\t\tcursor: default;\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tbackground: #f3f4f5;\n\t\t\t\t\t\tcolor: @successText;\n\t\t\t\t\t\tcursor: default;\n\n\t\t\t\t\t\t.chevron:before {\n\t\t\t\t\t\t\tborder-left-color: #f3f4f5;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tli {\n\t\t\tfloat: left;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0 20px 0 30px;\n\t\t\theight: 46px;\n\t\t\tline-height: 46px;\n\t\t\tposition: relative;\n\t\t\tbackground: #ededed;\n\t\t\tcolor: @grayLight;\n\t\t\tfont-size: 16px;\n\t\t\tcursor: not-allowed;\n\n\t\t\t.chevron {\n\t\t\t\tborder: 24px solid transparent;\n\t\t\t\tborder-left: 14px solid @navbarBorder;\n\t\t\t\tborder-right: 0;\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: -14px;\n\t\t\t\ttop: 0;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t.chevron:before {\n\t\t\t\tborder: 24px solid transparent;\n\t\t\t\tborder-left: 14px solid #ededed;\n\t\t\t\tborder-right: 0;\n\t\t\t\tcontent: \"\";\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 1px;\n\t\t\t\ttop: -24px;\n\t\t\t}\n\n\t\t\t&.complete {\n\t\t\t\tbackground: #f3f4f5;\n\t\t\t\tcolor: @successText;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: #e7eff8;\n\t\t\t\t\tcursor: pointer;\n\n\t\t\t\t\t.chevron:before {\n\t\t\t\t\t\tborder-left: 14px solid #e7eff8;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t.chevron:before {\n\t\t\t\t\tborder-left: 14px solid #f3f4f5;\n\t\t\t\t}\n\t\t\t}\n\t\t\t&.active {\n\t\t\t\tbackground: #f1f6fc;\n\t\t\t\tcolor: @infoText;\n\t\t\t\tcursor: default;\n\n\t\t\t\t.chevron:before {\n\t\t\t\t\tborder-left: 14px solid #f1f6fc;\n\t\t\t\t}\n\n\t\t\t\t.badge {\n\t\t\t\t\tbackground-color: @infoText;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.badge {\n\t\t\t\tmargin-right: 8px;\n\t\t\t}\n\n\t\t\t.badge-success {\n\t\t\t\tbackground-color: @successText;\n\t\t\t}\n\t\t}\n\n\t\tli:first-child {\n\t\t\tborder-radius: 4px 0 0 4px;\n\t\t\tpadding-left: 20px;\n\t\t}\n\t}\n\n\t> .actions {\n\t\tz-index: 1000;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\tline-height: 46px;\n\t\tfloat: right;\n\t\tpadding-left: 15px;\n\t\tpadding-right: 15px;\n\t\tvertical-align: middle;\n\t\tbackground-color: #e5e5e5;\n\t\tborder-left: 1px solid @navbarBorder;\n\n\t\ta {\n\t\t\tline-height: 45px;\n\t\t\tfont-size: 12px;\n\t\t\tmargin-right: 8px;\n\t\t}\n\n\t\t.btn-prev {\n\t\t\t&[disabled] {\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\tspan {\n\t\t\t\tmargin-right: 5px;\n\t\t\t}\n\t\t}\n\n\t\t.btn-next {\n\t\t\t&[disabled] {\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\tspan {\n\t\t\t\tmargin-left: 5px;\n\t\t\t}\n\t\t}\n\t}\n\n\t.step-content {\n\t\tborder-top: 1px solid #D4D4D4;\n\t\tpadding: 10px;\n\t\tfloat: left;\n\t\twidth: 100%;\n\n\t\t.step-pane {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t> .active {\n\t\t\tdisplay: block;\n\n\t\t\t.btn-group {\n\t\t\t\t.active {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// when complete\n\t&.complete {\n\t\t> .actions .glyphicon-arrow-right:before {\n\t\t\tdisplay: none;\n\t\t}\n\t\t> .actions .glyphicon-arrow-right {\n\t\t\tmargin-left: 0;\n\t\t}\n\t}\n}"]} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.min.css b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.min.css deleted file mode 100644 index 758a7b824caed8f5487e2d10f51b5bebac32d7fa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/css/fuelux.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Fuel UX v3.0.2 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ - -@charset "UTF-8";.fuelux .clearfix{*zoom:1}.fuelux .clearfix:before,.fuelux .clearfix:after{display:table;content:"";line-height:0}.fuelux .clearfix:after{clear:both}@font-face{font-family:fuelux;src:url(../fonts/fuelux.eot);src:url(../fonts/fuelux.eot?#iefix) format("embedded-opentype"),url(../fonts/fuelux.woff) format("woff"),url(../fonts/fuelux.ttf) format("truetype"),url(../fonts/fuelux.svg#fuelux) format("svg");font-weight:400;font-style:normal}.fuelux [class^=fueluxicon-]:before,.fuelux [class*=" fueluxicon-"]:before{font-family:fuelux!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fuelux .fueluxicon-loader-full:before{content:"\e000"}.fuelux .fueluxicon-loader-1:before{content:"\e001"}.fuelux .fueluxicon-loader-2:before{content:"\e002"}.fuelux .fueluxicon-loader-3:before{content:"\e003"}.fuelux .fueluxicon-loader-4:before{content:"\e004"}.fuelux .fueluxicon-loader-5:before{content:"\e005"}.fuelux .fueluxicon-loader-6:before{content:"\e006"}.fuelux .fueluxicon-loader-7:before{content:"\e007"}.fuelux .fueluxicon-loader-8:before{content:"\e008"}.fuelux .fueluxicon-bullet:before{content:"\e009"}.fuelux .checkbox.highlight{padding:4px}.fuelux .checkbox.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .checkbox input[type=checkbox]:focus+.checkbox-label,.fuelux .checkbox input[type=checkbox]:hover+.checkbox-label,.fuelux .checkbox .checkbox-label:hover{color:#999}.fuelux .checkbox-custom{position:relative}.fuelux .checkbox-custom:before{font-family:"Glyphicons Halflings"!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;border:1px solid #adadad;border-radius:4px;color:#fff;content:" ";font-size:9px;height:14px;left:0;padding:1px 0 0 1px;position:absolute;top:3px;width:14px}.fuelux .checkbox-custom.checked:before{background:#39b3d7;border-color:#39b3d7;content:"\e013"}.fuelux .checkbox-custom.disabled{cursor:not-allowed}.fuelux .checkbox-custom.disabled:before{cursor:not-allowed;opacity:.5}.fuelux .checkbox-custom.checkbox-inline:before{left:0;top:3px}.fuelux .checkbox-custom.checkbox-inline.highlight{padding:4px 4px 4px 24px}.fuelux .checkbox-custom.checkbox-inline.highlight:before{left:4px;top:7px}.fuelux .checkbox-custom.checkbox-inline.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .checkbox-custom input[type=checkbox]:focus+.checkbox-label{color:#999}.fuelux .combobox.disabled .input-group-btn{cursor:not-allowed}.fuelux .datepicker-calendar{padding:16px 16px 0;min-height:262px}.fuelux .datepicker-calendar button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-calendar-days{height:182px;margin:10px 0 12px;width:100%}.fuelux .datepicker-calendar-days thead{border-bottom:1px solid #cccaca}.fuelux .datepicker-calendar-days tbody:before{line-height:3px;content:"\200C";display:block}.fuelux .datepicker-calendar-days td,.fuelux .datepicker-calendar-days th{font-size:14px;height:32px;text-align:center;vertical-align:middle;width:14.29%}.fuelux .datepicker-calendar-days td button{color:#231f20;display:inline-block;height:30px;text-decoration:none;width:30px}.fuelux .datepicker-calendar-days td span{display:block}.fuelux .datepicker-calendar-days td span:hover{background:#b7e3f8;text-decoration:none}.fuelux .datepicker-calendar-days td.current-day button{border:1px solid #1d75bb}.fuelux .datepicker-calendar-days td.last-month,.fuelux .datepicker-calendar-days td.next-month{background:#e3e2e1}.fuelux .datepicker-calendar-days td.past button{color:#8d8787}.fuelux .datepicker-calendar-days td.restricted button{cursor:no-drop;position:relative}.fuelux .datepicker-calendar-days td.restricted button:before{border-top:1px solid #a94442;bottom:0;content:" ";display:block;left:5px;position:absolute;right:5px;top:50%}.fuelux .datepicker-calendar-days td.restricted button:hover{background:0 0}.fuelux .datepicker-calendar-days td.selected span{background:#1d75bb}.fuelux .datepicker-calendar-days td.selected span:hover{background:#0f5f9f}.fuelux .datepicker-calendar-days td.selected button{color:#fff}.fuelux .datepicker-calendar-days td.selected.current-day{box-shadow:0 0 0 1px #fff offset}.fuelux .datepicker-calendar-days th{font-weight:700;height:22px;vertical-align:top}.fuelux .datepicker-calendar-header{*zoom:1}.fuelux .datepicker-calendar-header:before,.fuelux .datepicker-calendar-header:after{display:table;content:"";line-height:0}.fuelux .datepicker-calendar-header:after{clear:both}.fuelux .datepicker-calendar-header button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-calendar-header .title{margin:0 auto;text-align:center;display:block;width:174px;color:#4d4d4f;font-size:20px;line-height:30px;text-decoration:underline;vertical-align:middle}.fuelux .datepicker-calendar-header .title:hover{color:#1d75bb;text-decoration:underline}.fuelux .datepicker-calendar-header .title.disabled{cursor:default;pointer-events:none;text-decoration:none}.fuelux .datepicker-calendar-header .title .month{display:inline;margin:0;padding:0}.fuelux .datepicker-calendar-header .title .month span{display:none}.fuelux .datepicker-calendar-header .title .month span.current{display:inline}.fuelux .datepicker-calendar-header .next,.fuelux .datepicker-calendar-header .prev{background:#666669;background-clip:padding-box;border-radius:30px;cursor:pointer;float:left;height:30px;text-align:center;width:30px}.fuelux .datepicker-calendar-header .next span.glyphicon,.fuelux .datepicker-calendar-header .prev span.glyphicon{color:#fff;font-size:16px;line-height:30px}.fuelux .datepicker-calendar-header .next:hover,.fuelux .datepicker-calendar-header .prev:hover{background:#1d75bb}.fuelux .datepicker-calendar-header .next{float:right}.fuelux .datepicker-calendar-header .next span.glyphicon{line-height:28px}.fuelux .datepicker-calendar-footer{background:#e3e2e1;background-clip:padding-box;border-radius:0 0 4px 4px;border-top:1px solid #cccaca;height:30px;margin:0 -16px;padding:4px 14px}.fuelux .datepicker-calendar-footer .datepicker-today{color:#231f20;font-size:14px;text-decoration:underline}.fuelux .datepicker-calendar-footer .datepicker-today:hover{color:#1b75bb;text-decoration:underline}.fuelux .datepicker-calendar-footer .datepicker-today.disabled{color:#8b8c8e;cursor:default;pointer-events:none}.fuelux .datepicker-calendar-footer .datepicker-today.disabled:hover{color:#8b8c8e}.fuelux .datepicker-calendar-wrapper{border:1px solid #6e6f71;min-height:20px;padding:0;width:300px}.fuelux .datepicker-wheels{display:none}.fuelux .datepicker-wheels ul button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-wheels-footer{background:#e3e2e1;border-radius:0 0 4px 4px;border-top:1px solid #cccaca;clear:both}.fuelux .datepicker-wheels-footer .datepicker-wheels-back{display:block;color:#4d4d4f;float:left;line-height:22px;border:0;background-color:transparent}.fuelux .datepicker-wheels-footer .datepicker-wheels-back:hover{color:#1d75bb}.fuelux .datepicker-wheels-footer .datepicker-wheels-select{float:right;background-color:transparent;color:#049cdb}.fuelux .datepicker-wheels-footer .datepicker-wheels-select:hover{color:#1d75bb}.fuelux .datepicker-wheels-month,.fuelux .datepicker-wheels-year{float:left;width:50%}.fuelux .datepicker-wheels-month ul,.fuelux .datepicker-wheels-year ul{height:217px;list-style-type:none;margin:0;overflow:auto;padding:0;text-align:center}.fuelux .datepicker-wheels-month ul li,.fuelux .datepicker-wheels-year ul li{margin:4px 0}.fuelux .datepicker-wheels-month ul li button,.fuelux .datepicker-wheels-year ul li button{width:100%;text-align:center;color:#414041;display:block;font-size:16px;line-height:24px;text-decoration:none}.fuelux .datepicker-wheels-month ul li button:hover,.fuelux .datepicker-wheels-year ul li button:hover{background:#aee0f8;text-decoration:none}.fuelux .datepicker-wheels-month ul li.selected button,.fuelux .datepicker-wheels-year ul li.selected button{background:#1d75bb;color:#fff}.fuelux .datepicker-wheels-month ul li.selected button:hover,.fuelux .datepicker-wheels-year ul li.selected button:hover{background:#0f5f9f}.fuelux .datepicker-wheels-month .header,.fuelux .datepicker-wheels-year .header{background:#e3e2e1;background-clip:padding-box;border-bottom:1px solid #cccaca;border-radius:4px 0 0;color:#4d4d4f;font-size:20px;font-weight:700;line-height:30px;margin-top:0;margin-bottom:0;text-align:center}.fuelux .datepicker-wheels-month.full,.fuelux .datepicker-wheels-year.full{border-left:0;width:100%}.fuelux .datepicker-wheels-month.full .header,.fuelux .datepicker-wheels-year.full .header{border-radius:4px 4px 0 0}.fuelux .datepicker-wheels-year{border-left:1px solid #cccaca;float:right}.fuelux .datepicker-wheels-year .header{border-radius:0 4px 0 0}.fuelux .infinitescroll{overflow-y:auto}.fuelux .infinitescroll .infinitescroll-end{clear:both;font-style:italic;padding:6px;text-align:center}.fuelux .infinitescroll .infinitescroll-load{clear:both;padding:6px}.fuelux .infinitescroll .infinitescroll-load button{padding:5px 12px;width:100%}.fuelux .infinitescroll .infinitescroll-load .loader{font-size:32px;height:32px;margin:0 auto;width:32px}.fuelux .dropUp{-webkit-box-shadow:0 0 10px rgba(0,0,0,.2);-moz-box-shadow:0 0 10px rgba(0,0,0,.2);box-shadow:0 0 10px rgba(0,0,0,.2)}.fuelux .loader{height:64px;font-size:64px;position:relative;width:64px}.fuelux .loader:after,.fuelux .loader:before{font-family:fuelux!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;bottom:0;display:block;left:0;position:absolute;right:0;top:0}.fuelux .loader:before{content:'\e000';opacity:.33}.fuelux .loader.iefix:before{color:#bcbcbc;opacity:1}.fuelux .loader[data-frame="1"]:after{content:'\e001'}.fuelux .loader[data-frame="2"]:after{content:'\e002'}.fuelux .loader[data-frame="3"]:after{content:'\e003'}.fuelux .loader[data-frame="4"]:after{content:'\e004'}.fuelux .loader[data-frame="5"]:after{content:'\e005'}.fuelux .loader[data-frame="6"]:after{content:'\e006'}.fuelux .loader[data-frame="7"]:after{content:'\e007'}.fuelux .loader[data-frame="8"]:after{content:'\e008'}.fuelux input.glass,.fuelux textarea.glass{background:0 0;border:1px solid #fff;box-shadow:none}.fuelux input.glass:hover,.fuelux textarea.glass:hover{background:#d9edf7;border-color:#66afe9;cursor:pointer}.fuelux input.glass:hover[disabled],.fuelux textarea.glass:hover[disabled]{background:0 0;border-color:#fff;cursor:not-allowed}.fuelux input.glass:focus,.fuelux textarea.glass:focus{background:#fff;border-color:#66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);cursor:auto}.fuelux input.glass:focus[disabled],.fuelux textarea.glass:focus[disabled]{background:0 0;border-color:#fff;cursor:not-allowed}.fuelux input.glass[disabled],.fuelux textarea.glass[disabled]{cursor:not-allowed}.fuelux [data-toggle=buttons]>.btn>input[type=radio],.fuelux [data-toggle=buttons]>.btn>input[type=checkbox]{display:inline;position:absolute;left:-9999px}.fuelux .pillbox{border:1px solid #BBB;border-radius:4px;cursor:text;padding:3px}.fuelux .pillbox[data-readonly]{border:1px solid transparent}.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap{display:inline-block}.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap.truncated{display:none}.fuelux .pillbox[data-readonly].truncate .pillbox-more{display:inline}.fuelux .pillbox[data-readonly] .pill span.glyphicon-close{display:none}.fuelux .pillbox[data-readonly] .pillbox-add-item{display:none}.fuelux .pillbox[data-readonly] .pillbox-input-wrap{display:none}.fuelux .pillbox[data-readonly] .pillbox-input-wrap button.dropdown-toggle{display:none}.fuelux .pillbox.pills-editable .pill-group .pill span{cursor:text}.fuelux .pillbox.pills-editable .pill-group .pill span.glyphicon-close{cursor:pointer}.fuelux .pillbox>.pill-group{margin:0;padding:0;width:100%}.fuelux .pillbox>.pill-group>.pill{margin:2px;cursor:default;float:left;word-break:break-all}.fuelux .pillbox>.pill-group>.pill.pillbox-highlight{outline:1px dotted #999}.fuelux .pillbox>.pill-group>.pill.truncated{display:none}.fuelux .pillbox>.pill-group>.pill .pillbox-list-edit{border:0;color:#333;font-weight:400;border-radius:2px}.fuelux .pillbox>.pill-group>.pill .pillbox-list-edit:focus{outline:0;border:0}.fuelux .pillbox>.pill-group>.pill .glyphicon-close{cursor:pointer;top:-1px;left:2px}.fuelux .pillbox>.pill-group>.pill .glyphicon-close:before{content:" \00d7"}.fuelux .pillbox>.pill-group>.pill .glyphicon-close:hover{opacity:.4}.fuelux .pillbox .pillbox-input-wrap{position:relative;margin:4px 0 3px 3px;float:left}.fuelux .pillbox .pillbox-input-wrap.editing{border:1px solid #ccc;border-radius:4px;margin:2px 0 3px 3px}.fuelux .pillbox .pillbox-input-wrap.editing input.pillbox-add-item{border-radius:4px;color:#333;height:32px}.fuelux .pillbox .pillbox-add-item{border:0;box-shadow:none}.fuelux .pillbox .pillbox-add-item:focus{outline:0;border:0}.fuelux .pillbox .pillbox-more{cursor:pointer;display:none;line-height:30px}.fuelux .pillbox .suggest{max-height:166px;overflow-y:auto}.fuelux .pillbox .suggest>li{white-space:nowrap;cursor:pointer;padding:3px 20px}.fuelux .pillbox .suggest>li.pillbox-suggest-sel{background-color:#eee}.fuelux .pillbox .suggest>li:hover{background-color:#eee}.fuelux .placard{display:inline-block;position:relative}.fuelux .placard[data-ellipsis=true].showing input.placard-field{overflow:visible;text-overflow:clip;white-space:normal}.fuelux .placard[data-ellipsis=true] input.placard-field{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fuelux .placard[data-ellipsis=true] textarea.placard-field[readonly]{overflow:hidden}.fuelux .placard.showing .placard-footer,.fuelux .placard.showing .placard-header,.fuelux .placard.showing .placard-popup{display:block;z-index:1}.fuelux .placard.showing input.placard-field,.fuelux .placard.showing textarea.placard-field{background:#fff;border:1px solid #CCC;box-shadow:none;position:relative;z-index:1}.fuelux .placard input.placard-field,.fuelux .placard textarea.placard-field{resize:none}.fuelux .placard input.placard-field[readonly],.fuelux .placard textarea.placard-field[readonly]{background:#fff;cursor:auto}.fuelux .placard input.placard-field[readonly].glass,.fuelux .placard textarea.placard-field[readonly].glass{background:0 0}.fuelux .placard input.placard-field[readonly].glass:hover,.fuelux .placard textarea.placard-field[readonly].glass:hover{background:#d9edf7;cursor:pointer}.fuelux .placard input.placard-field:focus,.fuelux .placard textarea.placard-field:focus{border:1px solid #CCC;box-shadow:none}.fuelux .placard-cancel{font-size:12px;margin-right:4px;vertical-align:middle}.fuelux .placard-footer,.fuelux .placard-header{display:none;left:0;line-height:1;position:absolute;right:0}.fuelux .placard-footer{padding:4px 0 8px;text-align:right;top:100%}.fuelux .placard-header{bottom:100%;padding:8px 0 4px}.fuelux .placard-header h1,.fuelux .placard-header h2,.fuelux .placard-header h3,.fuelux .placard-header h4,.fuelux .placard-header h5,.fuelux .placard-header h6{margin:0}.fuelux .placard-popup{background:#d9edf7;background-clip:padding-box;border:1px solid #ccc;border-radius:4px;bottom:-8px;box-shadow:0 0 0 1px #fff inset;display:none;left:-8px;position:absolute;right:-8px;top:-8px}.fuelux .radio.highlight{padding:4px}.fuelux .radio.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .radio input[type=radio]:focus+.radio-label,.fuelux .radio input[type=radio]:hover+.radio-label,.fuelux .radio .radio-label:hover{color:#999}.fuelux .radio-custom{position:relative}.fuelux .radio-custom:after{background:0 0;border-radius:6px;content:" ";height:6px;left:4px;position:absolute;top:7px;width:6px}.fuelux .radio-custom:before{border:1px solid #adadad;border-radius:14px;content:" ";height:14px;left:0;position:absolute;top:3px;width:14px}.fuelux .radio-custom.checked:after{background:#fff}.fuelux .radio-custom.checked:before{background:#39b3d7;border-color:#39b3d7}.fuelux .radio-custom.disabled{cursor:not-allowed}.fuelux .radio-custom.disabled:after{cursor:not-allowed}.fuelux .radio-custom.disabled:before{cursor:not-allowed;opacity:.5}.fuelux .radio-custom.radio-inline:after{left:4px;top:7px}.fuelux .radio-custom.radio-inline:before{left:0;top:3px}.fuelux .radio-custom.radio-inline.highlight{padding:4px 4px 4px 24px}.fuelux .radio-custom.radio-inline.highlight:after{left:8px;top:11px}.fuelux .radio-custom.radio-inline.highlight:before{left:4px;top:7px}.fuelux .radio-custom.radio-inline.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .radio-custom input[type=radio]:focus+.radio-label{color:#999}.fuelux .repeater{border:1px solid #ddd;border-radius:4px}.fuelux .repeater-canvas.scrolling{bottom:0;left:0;overflow-y:auto;position:absolute;right:0;top:0}.fuelux .repeater-header,.fuelux .repeater-footer{background:#f9f9f9;min-height:50px;padding:8px;*zoom:1}.fuelux .repeater-header:before,.fuelux .repeater-footer:before,.fuelux .repeater-header:after,.fuelux .repeater-footer:after{display:table;content:"";line-height:0}.fuelux .repeater-header:after,.fuelux .repeater-footer:after{clear:both}.fuelux .repeater-header-left,.fuelux .repeater-footer-left{float:left}.fuelux .repeater-header-right,.fuelux .repeater-footer-right{float:right}@media (max-width:625px){.fuelux .repeater-header-left,.fuelux .repeater-footer-left,.fuelux .repeater-header-right,.fuelux .repeater-footer-right{float:none;*zoom:1}.fuelux .repeater-header-left:before,.fuelux .repeater-footer-left:before,.fuelux .repeater-header-right:before,.fuelux .repeater-footer-right:before,.fuelux .repeater-header-left:after,.fuelux .repeater-footer-left:after,.fuelux .repeater-header-right:after,.fuelux .repeater-footer-right:after{display:table;content:"";line-height:0}.fuelux .repeater-header-left:after,.fuelux .repeater-footer-left:after,.fuelux .repeater-header-right:after,.fuelux .repeater-footer-right:after{clear:both}.fuelux .repeater-header-left,.fuelux .repeater-footer-left{margin-bottom:8px}}.fuelux .repeater-header{border-bottom:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px}.fuelux .repeater-footer{border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.fuelux .repeater-loader{display:none;left:50%;position:absolute;margin:-32px 0 0 -32px;top:50%}.fuelux .repeater-viewport{min-height:80px;position:relative}.fuelux .repeater-pagination label{font-weight:400}.fuelux .repeater-pagination .repeater-primaryPaging{display:none;vertical-align:middle;width:116px}.fuelux .repeater-pagination .repeater-primaryPaging.active{display:inline-block}.fuelux .repeater-pagination .repeater-primaryPaging ul.dropdown-menu{min-width:116px}.fuelux .repeater-pagination .repeater-secondaryPaging{display:none;width:82px}.fuelux .repeater-pagination .repeater-secondaryPaging.active{display:inline-block}.fuelux .repeater-search{float:left;width:200px}.fuelux .repeater-title{display:block;float:left;line-height:34px;margin-right:10px}.fuelux .repeater[data-currentview=list] .repeater-loader{margin-top:-12px}.fuelux .repeater[data-currentview=list] .repeater-loader.noHeader{margin-top:-32px}.fuelux .repeater-list-check{display:inline-block;height:0;line-height:0;position:relative;vertical-align:top;width:0}.fuelux .repeater-list-check span.glyphicon{left:-22px;position:absolute;top:2px}.fuelux .repeater-list-header,.fuelux .repeater-list-items{margin-bottom:0;width:100%}.fuelux .repeater-list-header td,.fuelux .repeater-list-items td{border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0}.fuelux .repeater-list-header td:first-child,.fuelux .repeater-list-items td:first-child{border-left:0}.fuelux .repeater-list-header{background:#F9F9F9}.fuelux .repeater-list-header td{font-weight:700}.fuelux .repeater-list-header td.sortable:hover,.fuelux .repeater-list-header td.sortable.sorted{background:#F1F1F1;cursor:pointer;background-color:#f1f1f1;background-image:-moz-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:-o-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:linear-gradient(to bottom,#f9f9f9,#e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#ffe5e5e5', GradientType=0)}.fuelux .repeater-list-header td.sortable.sorted span.glyphicon{display:block}.fuelux .repeater-list-header td span.glyphicon{display:none;float:right;margin-top:2px}.fuelux .repeater-list-items tr.empty td{border-bottom:0;font-style:italic;padding:20px;text-align:center;width:100%}.fuelux .repeater-list-items tr.selectable:hover{background:#d9edf7;cursor:pointer}.fuelux .repeater-list-items tr.selected{background:#66AFE9;color:#fff}.fuelux .repeater-list-items tr.selected:hover{background:#428bca}.fuelux .repeater-list-items tr.selected td:first-child{padding-left:30px}.fuelux .repeater-list-wrapper{overflow-y:auto}.fuelux .repeater-thumbnail{border:1px solid #ddd;color:#666;float:left;font-size:12px;height:130px;line-height:36px;margin:10px 12px;text-align:center;width:100px;-webkit-box-shadow:0 1px 4px 0 #ddd;box-shadow:0 1px 4px 0 #ddd}.fuelux .repeater-thumbnail img{display:block;margin-top:12px}.fuelux .repeater-thumbnail-cont{height:100%;overflow-y:auto;padding:10px;width:100%}.fuelux .repeater-thumbnail-cont div.empty{font-style:italic;padding:20px 10px;text-align:center}.fuelux .spinbox{display:inline-block;position:relative}.fuelux .spinbox.digits-3{width:60px}.fuelux .spinbox.disabled .spinbox-buttons{cursor:not-allowed}.fuelux .spinbox .spinbox-input{float:left;padding-bottom:3px;padding:0 25px 0 7px}.fuelux .spinbox .btn{position:relative;width:20px;height:13px;padding-top:0;padding-right:9px;padding-left:9px}.fuelux .spinbox .btn.disabled{cursor:not-allowed}.fuelux .spinbox .spinbox-buttons{position:absolute;height:28px;width:20px;right:2px}.fuelux .spinbox .spinbox-up{padding:0 0 14px 1px;top:2px}.fuelux .spinbox .spinbox-up .glyphicon-chevron-up{position:relative;top:0}.fuelux .spinbox .btn-group>.btn.spinbox-up{border-top-right-radius:4px}.fuelux .spinbox .spinbox-down{padding:0 0 8px 1px;top:2px;height:15px;border-bottom-left-radius:4px}.fuelux .spinbox .spinbox-down .glyphicon-chevron-down{position:relative;left:-1px;top:0}.fuelux .scheduler .control-label{min-width:7em}.fuelux .scheduler .inline-form-text{float:left;line-height:27px;margin-top:4px}.fuelux .scheduler .start-datetime.form-group{margin-bottom:0}.fuelux .scheduler .start-datetime .form-group{margin-left:0}.fuelux .scheduler .start-datetime .combobox{max-width:9em}.fuelux .scheduler .start-datetime .combobox .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .start-datetime .dropdown{float:left;margin:0 10px 0 0}.fuelux .scheduler .timezone-container .input-group{max-width:20em}.fuelux .scheduler .timezone-container .dropdown-label{height:18px;white-space:nowrap;max-width:20em;overflow:hidden;text-overflow:ellipsis}.fuelux .scheduler .timezone-container .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .repeat-panel{margin-left:0}.fuelux .scheduler .repeat-panel label{font-weight:400}.fuelux .scheduler .repeat-panel .radio{margin-right:10px}.fuelux .scheduler .repeat-panel .form-group{margin-left:0}.fuelux .scheduler .repeat-interval{margin-left:0;*zoom:1}.fuelux .scheduler .repeat-interval:before,.fuelux .scheduler .repeat-interval:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-interval:after{clear:both}.fuelux .scheduler .repeat-interval .form-group{margin-left:0}.fuelux .scheduler .repeat-interval .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .repeat-interval .repeat-every-panel{float:left}.fuelux .scheduler .repeat-interval .repeat-every-panel .repeat-every-pretext{padding:0 10px}.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox{float:left;margin-right:10px}.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox input{margin-bottom:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-date{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-monthly .repeat-monthly-date:before,.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after{clear:both}.fuelux .scheduler .repeat-monthly .repeat-monthly-date .selectlist{margin-left:5px}.fuelux .scheduler .repeat-monthly .repeat-monthly-day{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-monthly .repeat-monthly-day:before,.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after{clear:both}.fuelux .scheduler .repeat-monthly .month-days{margin-left:10px}.fuelux .scheduler .repeat-yearly .repeat-yearly-date{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-yearly .repeat-yearly-date:before,.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after{clear:both}.fuelux .scheduler .repeat-yearly .repeat-yearly-date .year-month-day{margin-left:10px}.fuelux .scheduler .repeat-yearly .year-month-days{margin-left:10px}.fuelux .scheduler .repeat-yearly .year-month{margin-left:10px}.fuelux .scheduler .repeat-yearly .repeat-yearly-day{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-yearly .repeat-yearly-day:before,.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after{clear:both}.fuelux .scheduler .repeat-yearly .repeat-yearly-day .repeat-yearly-day-text{margin-left:10px}.fuelux .scheduler .repeat-weekly button:not(.active){background-color:#fff}.fuelux .scheduler .repeat-weekly .btn-group.disabled{position:relative;opacity:.65}.fuelux .scheduler .repeat-weekly .btn-group.disabled:before{background:0 0;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:5}.fuelux .scheduler .selectlist{float:left}.fuelux .scheduler label.radio{float:left;line-height:27px}.fuelux .scheduler label.radio input{margin-top:8px}.fuelux .scheduler .repeat-end .end-after{float:left;display:inline-block;margin-right:10px}.fuelux .scheduler .repeat-end .form-group{margin-left:0}.fuelux .search.disabled .input-group-btn{cursor:not-allowed}.fuelux .selectlist.disabled{cursor:not-allowed}.fuelux .selectlist-sizer{display:inline-block;position:absolute;visibility:hidden;top:0}.fuelux .selectlist .selected-label{overflow:hidden;min-width:2em}.fuelux .selectlist .btn.dropdown-toggle{white-space:normal}.fuelux .selectlist .btn.dropdown-toggle .selected-label{padding-right:10px;text-align:left}.fuelux .tree{border:1px solid #999;border-radius:4px;padding:10px 15px 0;overflow-x:auto;overflow-y:auto;position:relative;list-style:none}.fuelux .tree :focus{outline:0}.fuelux .tree button:focus{color:#999}.fuelux .tree ul{padding-left:0;margin-top:0;margin-bottom:0;list-style:none}.fuelux .tree li{margin:0;margin-top:5px;margin-bottom:5px}.fuelux .tree .tree-loader{margin-left:45px}.fuelux .tree .tree-open>.tree-branch-header .glyphicon-play{transform:rotate(90deg);-ms-transform:rotate(90deg);-webkit-transform:rotate(90deg);position:relative;left:-5px}.fuelux .tree [data-children=false]>.tree-branch-header .icon-caret:before{content:'\00a0'}.fuelux .tree .tree-branch .tree-branch-header{position:relative;border-radius:6px}.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name:hover{color:#999}.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play{font-size:10px;padding-right:5px}.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play:before{position:relative;top:-2px}.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name{white-space:nowrap;border-radius:6px;background-color:transparent;border:0}.fuelux .tree .tree-branch .tree-branch-header label{font-weight:400;padding-left:3px;margin-bottom:0;cursor:pointer}.fuelux .tree .tree-branch .tree-branch-children{margin-left:14px}.fuelux .tree .tree-item{position:relative;cursor:pointer;border-radius:6px;margin-left:26px}.fuelux .tree .tree-item .tree-item-name{white-space:nowrap;border-radius:6px;background-color:transparent;border:0}.fuelux .tree .tree-item .tree-item-name:hover{color:#999}.fuelux .tree .tree-item.tree-selected .tree-item-name{background-color:#4f4f4f;color:#fff}.fuelux .tree .tree-item label{font-weight:400;padding-left:7px;margin-bottom:0;cursor:pointer}.fuelux .tree .icon-caret:hover+.tree-branch-name{color:#999}.fuelux .tree.tree-folder-select .tree-branch .icon-caret{background-color:transparent;border:0}.fuelux .tree.tree-folder-select .tree-branch .icon-caret:hover{cursor:pointer;color:#999}.fuelux .tree.tree-folder-select .tree-branch>.tree-branch-name{padding:1px 5px 0;border-radius:6px}.fuelux .tree.tree-folder-select .tree-branch>.tree-branch-name.tree-selected{background-color:#4f4f4f;color:#fff}.fuelux .tree.tree-folder-select .tree-branch.tree-selected>.tree-branch-header .tree-branch-name{background-color:#4f4f4f;color:#fff}.fuelux .tree.tree-folder-select .tree-branch.tree-selected>.tree-branch-header .tree-branch-name:hover{background-color:#4f4f4f;color:#fff}.fuelux .wizard{*zoom:1;border:1px solid #d4d4d4;border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,.065);background-color:#f9f9f9;position:relative;min-height:48px;overflow:hidden}.fuelux .wizard:before,.fuelux .wizard:after{display:table;content:"";line-height:0}.fuelux .wizard:after{clear:both}.fuelux .wizard>.steps{list-style:none outside none;padding:0;margin:0;width:4000px}.fuelux .wizard>.steps.previous-disabled li.complete{cursor:default}.fuelux .wizard>.steps.previous-disabled li.complete:hover{background:#f3f4f5;color:#468847;cursor:default}.fuelux .wizard>.steps.previous-disabled li.complete:hover .chevron:before{border-left-color:#f3f4f5}.fuelux .wizard>.steps li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#999;font-size:16px;cursor:not-allowed}.fuelux .wizard>.steps li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.fuelux .wizard>.steps li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.fuelux .wizard>.steps li.complete{background:#f3f4f5;color:#468847}.fuelux .wizard>.steps li.complete:hover{background:#e7eff8;cursor:pointer}.fuelux .wizard>.steps li.complete:hover .chevron:before{border-left:14px solid #e7eff8}.fuelux .wizard>.steps li.complete .chevron:before{border-left:14px solid #f3f4f5}.fuelux .wizard>.steps li.active{background:#f1f6fc;color:#3a87ad;cursor:default}.fuelux .wizard>.steps li.active .chevron:before{border-left:14px solid #f1f6fc}.fuelux .wizard>.steps li.active .badge{background-color:#3a87ad}.fuelux .wizard>.steps li .badge{margin-right:8px}.fuelux .wizard>.steps li .badge-success{background-color:#468847}.fuelux .wizard>.steps li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.fuelux .wizard>.actions{z-index:1000;position:absolute;right:0;line-height:46px;float:right;padding-left:15px;padding-right:15px;vertical-align:middle;background-color:#e5e5e5;border-left:1px solid #d4d4d4}.fuelux .wizard>.actions a{line-height:45px;font-size:12px;margin-right:8px}.fuelux .wizard>.actions .btn-prev[disabled]{cursor:not-allowed}.fuelux .wizard>.actions .btn-prev span{margin-right:5px}.fuelux .wizard>.actions .btn-next[disabled]{cursor:not-allowed}.fuelux .wizard>.actions .btn-next span{margin-left:5px}.fuelux .wizard .step-content{border-top:1px solid #D4D4D4;padding:10px;float:left;width:100%}.fuelux .wizard .step-content .step-pane{display:none}.fuelux .wizard .step-content>.active{display:block}.fuelux .wizard .step-content>.active .btn-group .active{display:inline-block}.fuelux .wizard.complete>.actions .glyphicon-arrow-right:before{display:none}.fuelux .wizard.complete>.actions .glyphicon-arrow-right{margin-left:0} \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.eot b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.eot deleted file mode 100644 index 36f005ee9819158bf4dbb3e0cf3b94949c755d26..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.eot and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.svg b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.svg deleted file mode 100644 index 4f0eeb005708f4e95c9090a068d678c6cfcf7169..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.svg +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by Fontastic.me</metadata> -<defs> -<font id="fuelux" horiz-adv-x="512"> -<font-face font-family="fuelux" units-per-em="512" ascent="480" descent="-32"/> -<missing-glyph horiz-adv-x="512" /> - -<glyph unicode="" d="M151 391c26 19 56 32 90 35l0 83c-56-3-108-25-149-59z m-148-114l84 0c4 34 18 64 38 89l-58 58c-36-39-59-91-64-147z m59-185l59 59c-19 26-32 56-35 90l-83 0c3-56 25-108 59-149z m173-5c-34 4-64 18-89 38l-58-58c39-36 91-59 147-64z m126 34c-26-19-56-32-90-35l0-83c56 3 108 25 149 59z m148 114l-84 0c-4-34-18-64-38-89l58-58c36 39 59 91 64 147z m-232 190c34-4 64-18 89-38l58 58c-39 36-91 59-147 64z m173-5l-59-59c19-26 32-56 35-90l83 0c-3 56-25 108-59 149z"/> -<glyph unicode="" d="M277 425c34-4 64-18 89-38l58 58c-39 36-91 59-147 64z"/> -<glyph unicode="" d="M450 420l-59-59c19-26 32-56 35-90l83 0c-3 56-25 108-59 149z"/> -<glyph unicode="" d="M509 235l-84 0c-4-34-18-64-38-89l58-58c36 39 59 91 64 147z"/> -<glyph unicode="" d="M361 121c-26-19-56-32-90-35l0-83c56 3 108 25 149 59z"/> -<glyph unicode="" d="M235 87c-34 4-64 18-89 38l-58-58c39-36 91-59 147-64z"/> -<glyph unicode="" d="M62 92l59 59c-19 26-32 56-35 90l-83 0c3-56 25-108 59-149z"/> -<glyph unicode="" d="M3 277l84 0c4 34 18 64 38 89l-58 58c-36-39-59-91-64-147z"/> -<glyph unicode="" d="M151 391c26 19 56 32 90 35l0 83c-56-3-108-25-149-59z"/> -<glyph unicode="" d="M336 218c0-47-38-85-85-85-46 0-84 38-84 85 0 46 38 84 84 84 47 0 85-38 85-84z"/> -</font></defs></svg> diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.ttf b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.ttf deleted file mode 100644 index 100a104bf190eaae589165a04a19db27beef7d2c..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.ttf and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.woff b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.woff deleted file mode 100644 index 4c2cd2d62cb06f7ffd09ae877a475c3887d9dc04..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/fonts/fuelux.woff and /dev/null differ diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.js deleted file mode 100644 index 84b321b12d1fede074656b771d58758b7857d78e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.js +++ /dev/null @@ -1,6226 +0,0 @@ -/*! - * Fuel UX v3.0.2 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ - - -// For more information on UMD visit: https://github.com/umdjs/umd/ -( function( factory ) { - if ( typeof define === 'function' && define.amd ) { - define( [ 'jquery', 'bootstrap' ], factory ); - } else { - factory( jQuery ); - } -}( function( jQuery ) { - - if ( typeof jQuery === 'undefined' ) { - throw new Error( 'Fuel UX\'s JavaScript requires jQuery' ) - } - - if ( typeof jQuery.fn.dropdown === 'undefined' || typeof jQuery.fn.collapse === 'undefined' ) { - throw new Error( 'Fuel UX\'s JavaScript requires Bootstrap' ) - } - - ( function( $ ) { - - /* - * Fuel UX Checkbox - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.checkbox; - - // CHECKBOX CONSTRUCTOR AND PROTOTYPE - - var Checkbox = function( element, options ) { - this.options = $.extend( {}, $.fn.checkbox.defaults, options ); - - // cache elements - this.$element = $( element ).is( 'input[type="checkbox"]' ) ? $( element ) : $( element ).find( 'input[type="checkbox"]:first' ); - this.$label = this.$element.parent(); - this.$parent = this.$label.parent( '.checkbox' ); - this.$toggleContainer = this.$element.attr( 'data-toggle' ); - this.state = { - disabled: false, - checked: false - }; - - if ( this.$parent.length === 0 ) { - this.$parent = null; - } - - if ( Boolean( this.$toggleContainer ) ) { - this.$toggleContainer = $( this.$toggleContainer ); - } else { - this.$toggleContainer = null; - } - - // handle events - this.$element.on( 'change.fu.checkbox', $.proxy( this.itemchecked, this ) ); - - // set default state - this.setState(); - }; - - Checkbox.prototype = { - - constructor: Checkbox, - - setState: function( $chk ) { - $chk = $chk || this.$element; - - this.state.disabled = Boolean( $chk.prop( 'disabled' ) ); - this.state.checked = Boolean( $chk.is( ':checked' ) ); - - this._resetClasses(); - - // set state of checkbox - this._toggleCheckedState(); - this._toggleDisabledState(); - - //toggle container - this.toggleContainer(); - }, - - enable: function() { - this.state.disabled = false; - this.$element.attr( 'disabled', false ); - this._resetClasses(); - this.$element.trigger( 'enabled.fu.checkbox' ); - }, - - disable: function() { - this.state.disabled = true; - this.$element.attr( 'disabled', true ); - this._setDisabledClass(); - this.$element.trigger( 'disabled.fu.checkbox' ); - }, - - check: function() { - this.state.checked = true; - this.$element.prop( 'checked', true ); - this._setCheckedClass(); - this.$element.trigger( 'checked.fu.checkbox' ); - }, - - uncheck: function() { - this.state.checked = false; - this.$element.prop( 'checked', false ); - this._resetClasses(); - this.$element.trigger( 'unchecked.fu.checkbox' ); - }, - - isChecked: function() { - return this.state.checked; - }, - - toggle: function() { - this.state.checked = !this.state.checked; - - this._toggleCheckedState(); - }, - - toggleContainer: function() { - if ( Boolean( this.$toggleContainer ) ) { - if ( this.state.checked ) { - this.$toggleContainer.removeClass( 'hide' ); - this.$toggleContainer.attr( 'aria-hidden', 'false' ); - } else { - this.$toggleContainer.addClass( 'hide' ); - this.$toggleContainer.attr( 'aria-hidden', 'true' ); - } - } - }, - - itemchecked: function( element ) { - this.setState( $( element.target ) ); - }, - - destroy: function() { - this.$parent.remove(); - // remove any external bindings - // [none] - // empty elements to return to original markup - // [none] - return this.$parent[ 0 ].outerHTML; - }, - - _resetClasses: function() { - var classesToRemove = []; - - if ( !this.state.checked ) { - classesToRemove.push( 'checked' ); - } - - if ( !this.state.disabled ) { - classesToRemove.push( 'disabled' ); - } - - classesToRemove = classesToRemove.join( ' ' ); - - this.$label.removeClass( classesToRemove ); - - if ( this.$parent ) { - this.$parent.removeClass( classesToRemove ); - } - }, - - _toggleCheckedState: function() { - if ( this.state.checked ) { - this.check(); - } else { - this.uncheck(); - } - }, - - _toggleDisabledState: function() { - if ( this.state.disabled ) { - this.disable(); - } else { - this.enable(); - } - }, - - _setCheckedClass: function() { - this.$label.addClass( 'checked' ); - - if ( this.$parent ) { - this.$parent.addClass( 'checked' ); - } - }, - - _setDisabledClass: function() { - this.$label.addClass( 'disabled' ); - - if ( this.$parent ) { - this.$parent.addClass( 'disabled' ); - } - } - }; - - - // CHECKBOX PLUGIN DEFINITION - - $.fn.checkbox = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.checkbox' ); - var options = typeof option === 'object' && option; - - if ( !data ) { - $this.data( 'fu.checkbox', ( data = new Checkbox( this, options ) ) ); - } - - if ( typeof option === 'string' ) { - methodReturn = data[ option ].apply( data, args ); - } - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.checkbox.defaults = {}; - - $.fn.checkbox.Constructor = Checkbox; - - $.fn.checkbox.noConflict = function() { - $.fn.checkbox = old; - return this; - }; - - // DATA-API - - $( document ).on( 'mouseover.fu.checkbox.data-api', '[data-initialize=checkbox]', function( e ) { - var $control = $( e.target ).closest( '.checkbox' ).find( '[type=checkbox]' ); - if ( !$control.data( 'fu.checkbox' ) ) { - $control.checkbox( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=checkbox] [type=checkbox]' ).each( function() { - var $this = $( this ); - if ( !$this.data( 'fu.checkbox' ) ) { - $this.checkbox( $this.data() ); - } - } ); - } ); - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Combobox - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.combobox; - - - // COMBOBOX CONSTRUCTOR AND PROTOTYPE - - var Combobox = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.combobox.defaults, options ); - - this.$dropMenu = this.$element.find( '.dropdown-menu' ); - this.$input = this.$element.find( 'input' ); - this.$button = this.$element.find( '.btn' ); - - this.$element.on( 'click.fu.combobox', 'a', $.proxy( this.itemclicked, this ) ); - this.$element.on( 'change.fu.combobox', 'input', $.proxy( this.inputchanged, this ) ); - this.$element.on( 'shown.bs.dropdown', $.proxy( this.menuShown, this ) ); - - // set default selection - this.setDefaultSelection(); - }; - - Combobox.prototype = { - - constructor: Combobox, - - destroy: function() { - this.$element.remove(); - // remove any external bindings - // [none] - - // set input value attrbute in markup - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - - // empty elements to return to original markup - // [none] - - return this.$element[ 0 ].outerHTML; - }, - - doSelect: function( $item ) { - if ( typeof $item[ 0 ] !== 'undefined' ) { - this.$selectedItem = $item; - this.$input.val( this.$selectedItem.text() ); - } else { - this.$selectedItem = null; - } - }, - - menuShown: function() { - if ( this.options.autoResizeMenu ) { - this.resizeMenu(); - } - }, - - resizeMenu: function() { - var width = this.$element.outerWidth(); - this.$dropMenu.outerWidth( width ); - }, - - selectedItem: function() { - var item = this.$selectedItem; - var data = {}; - - if ( item ) { - var txt = this.$selectedItem.text(); - data = $.extend( { - text: txt - }, this.$selectedItem.data() ); - } else { - data = { - text: this.$input.val() - }; - } - - return data; - }, - - selectByText: function( text ) { - var $item = $( [] ); - this.$element.find( 'li' ).each( function() { - if ( ( this.textContent || this.innerText || $( this ).text() || '' ).toLowerCase() === ( text || '' ).toLowerCase() ) { - $item = $( this ); - return false; - } - } ); - this.doSelect( $item ); - }, - - selectByValue: function( value ) { - var selector = 'li[data-value="' + value + '"]'; - this.selectBySelector( selector ); - }, - - selectByIndex: function( index ) { - // zero-based index - var selector = 'li:eq(' + index + ')'; - this.selectBySelector( selector ); - }, - - selectBySelector: function( selector ) { - var $item = this.$element.find( selector ); - this.doSelect( $item ); - }, - - setDefaultSelection: function() { - var selector = 'li[data-selected=true]:first'; - var item = this.$element.find( selector ); - - if ( item.length > 0 ) { - // select by data-attribute - this.selectBySelector( selector ); - item.removeData( 'selected' ); - item.removeAttr( 'data-selected' ); - } - }, - - enable: function() { - this.$element.removeClass( 'disabled' ); - this.$input.removeAttr( 'disabled' ); - this.$button.removeClass( 'disabled' ); - }, - - disable: function() { - this.$element.addClass( 'disabled' ); - this.$input.attr( 'disabled', true ); - this.$button.addClass( 'disabled' ); - }, - - itemclicked: function( e ) { - this.$selectedItem = $( e.target ).parent(); - - // set input text and trigger input change event marked as synthetic - this.$input.val( this.$selectedItem.text() ).trigger( 'change', { - synthetic: true - } ); - - // pass object including text and any data-attributes - // to onchange event - var data = this.selectedItem(); - - // trigger changed event - this.$element.trigger( 'changed.fu.combobox', data ); - - e.preventDefault(); - - // return focus to control after selecting an option - this.$element.find( '.dropdown-toggle' ).focus(); - }, - - inputchanged: function( e, extra ) { - - // skip processing for internally-generated synthetic event - // to avoid double processing - if ( extra && extra.synthetic ) return; - - var val = $( e.target ).val(); - this.selectByText( val ); - - // find match based on input - // if no match, pass the input value - var data = this.selectedItem(); - if ( data.text.length === 0 ) { - data = { - text: val - }; - } - - // trigger changed event - this.$element.trigger( 'changed.fu.combobox', data ); - - } - - }; - - - // COMBOBOX PLUGIN DEFINITION - - $.fn.combobox = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.combobox' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.combobox', ( data = new Combobox( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.combobox.defaults = { - autoResizeMenu: true - }; - - $.fn.combobox.Constructor = Combobox; - - $.fn.combobox.noConflict = function() { - $.fn.combobox = old; - return this; - }; - - // DATA-API - - $( document ).on( 'mousedown.fu.combobox.data-api', '[data-initialize=combobox]', function( e ) { - var $control = $( e.target ).closest( '.combobox' ); - if ( !$control.data( 'fu.combobox' ) ) { - $control.combobox( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=combobox]' ).each( function() { - var $this = $( this ); - if ( !$this.data( 'fu.combobox' ) ) { - $this.combobox( $this.data() ); - } - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Datepicker - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var INVALID_DATE = 'Invalid Date'; - var MOMENT_NOT_AVAILABLE = 'moment.js is not available so you cannot use this function'; - - var datepickerStack = []; - var moment = false; - var old = $.fn.datepicker; - var requestedMoment = false; - - var runStack = function() { - var i, l; - requestedMoment = true; - for ( i = 0, l = datepickerStack.length; i < l; i++ ) { - datepickerStack[ i ].init.call( datepickerStack[ i ].scope ); - } - datepickerStack = []; - }; - - //only load moment if it's there. otherwise we'll look for it in window.moment - if ( typeof define === 'function' && define.amd ) { //check if AMD is available - require( [ 'moment' ], function( amdMoment ) { - moment = amdMoment; - runStack(); - }, function( err ) { - var failedId = err.requireModules && err.requireModules[ 0 ]; - if ( failedId === 'moment' ) { - runStack(); - } - } ); - } else { - runStack(); - } - - // DATEPICKER CONSTRUCTOR AND PROTOTYPE - - var Datepicker = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( true, {}, $.fn.datepicker.defaults, options ); - - this.$calendar = this.$element.find( '.datepicker-calendar' ); - this.$days = this.$calendar.find( '.datepicker-calendar-days' ); - this.$header = this.$calendar.find( '.datepicker-calendar-header' ); - this.$headerTitle = this.$header.find( '.title' ); - this.$input = this.$element.find( 'input' ); - this.$wheels = this.$element.find( '.datepicker-wheels' ); - this.$wheelsMonth = this.$element.find( '.datepicker-wheels-month' ); - this.$wheelsYear = this.$element.find( '.datepicker-wheels-year' ); - - this.artificialScrolling = false; - this.formatDate = this.options.formatDate || this.formatDate; - this.inputValue = null; - this.moment = false; - this.momentFormat = null; - this.parseDate = this.options.parseDate || this.parseDate; - this.preventBlurHide = false; - this.restricted = this.options.restricted || []; - this.restrictedParsed = []; - this.restrictedText = this.options.restrictedText; - this.sameYearOnly = this.options.sameYearOnly; - this.selectedDate = null; - this.yearRestriction = null; - - this.$calendar.find( '.datepicker-today' ).on( 'click.fu.datepicker', $.proxy( this.todayClicked, this ) ); - this.$days.on( 'click.fu.datepicker', 'tr td button', $.proxy( this.dateClicked, this ) ); - this.$element.find( '.dropdown-menu' ).on( 'mousedown.fu.datepicker', $.proxy( this.dropdownMousedown, this ) ); - this.$header.find( '.next' ).on( 'click.fu.datepicker', $.proxy( this.next, this ) ); - this.$header.find( '.prev' ).on( 'click.fu.datepicker', $.proxy( this.prev, this ) ); - this.$headerTitle.on( 'click.fu.datepicker', $.proxy( this.titleClicked, this ) ); - this.$input.on( 'blur.fu.datepicker', $.proxy( this.inputBlurred, this ) ); - this.$input.on( 'focus.fu.datepicker', $.proxy( this.inputFocused, this ) ); - this.$wheels.find( '.datepicker-wheels-back' ).on( 'click.fu.datepicker', $.proxy( this.backClicked, this ) ); - this.$wheels.find( '.datepicker-wheels-select' ).on( 'click.fu.datepicker', $.proxy( this.selectClicked, this ) ); - this.$wheelsMonth.on( 'click.fu.datepicker', 'ul button', $.proxy( this.monthClicked, this ) ); - this.$wheelsYear.on( 'click.fu.datepicker', 'ul button', $.proxy( this.yearClicked, this ) ); - this.$wheelsYear.find( 'ul' ).on( 'scroll.fu.datepicker', $.proxy( this.onYearScroll, this ) ); - - var init = function() { - if ( this.checkForMomentJS() ) { - moment = moment || window.moment; // need to pull in the global moment if they didn't do it via require - this.moment = true; - this.momentFormat = this.options.momentConfig.format; - this.setCulture( this.options.momentConfig.culture ); - } - - this.setRestrictedDates( this.restricted ); - if ( !this.setDate( this.options.date ) ) { - this.$input.val( '' ); - this.inputValue = this.$input.val(); - } - if ( this.sameYearOnly ) { - this.yearRestriction = ( this.selectedDate ) ? this.selectedDate.getFullYear() : new Date().getFullYear(); - } - }; - - if ( requestedMoment ) { - init.call( this ); - } else { - datepickerStack.push( { - init: init, - scope: this - } ); - } - }; - - Datepicker.prototype = { - - constructor: Datepicker, - - backClicked: function() { - this.changeView( 'calendar' ); - }, - - changeView: function( view, date ) { - if ( view === 'wheels' ) { - this.$calendar.hide().attr( 'aria-hidden', 'true' ); - this.$wheels.show().removeAttr( 'aria-hidden', '' ); - if ( date ) { - this.renderWheel( date ); - } - } else { - this.$wheels.hide().attr( 'aria-hidden', 'true' ); - this.$calendar.show().removeAttr( 'aria-hidden', '' ); - if ( date ) { - this.renderMonth( date ); - } - } - }, - - checkForMomentJS: function() { - if ( - ( $.isFunction( window.moment ) || ( typeof moment !== 'undefined' && $.isFunction( moment ) ) ) && - $.isPlainObject( this.options.momentConfig ) && - this.options.momentConfig.culture && this.options.momentConfig.format - ) { - return true; - } else { - return false; - } - }, - - dateClicked: function( e ) { - var $td = $( e.currentTarget ).parents( 'td:first' ); - var date; - - if ( $td.hasClass( 'restricted' ) ) { - return; - } - - this.$days.find( 'td.selected' ).removeClass( 'selected' ); - $td.addClass( 'selected' ); - - date = new Date( $td.attr( 'data-year' ), $td.attr( 'data-month' ), $td.attr( 'data-date' ) ); - this.selectedDate = date; - this.$input.val( this.formatDate( date ) ); - this.inputValue = this.$input.val(); - this.$input.focus(); - }, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - - // empty elements to return to original markup - this.$days.find( 'tbody' ).empty(); - this.$wheelsYear.find( 'ul' ).empty(); - - return this.$element[ 0 ].outerHTML; - }, - - disable: function() { - this.$element.addClass( 'disabled' ); - this.$element.find( 'input, button' ).attr( 'disabled', 'disabled' ); - this.$element.find( '.input-group-btn' ).removeClass( 'open' ); - }, - - dropdownMousedown: function() { - var self = this; - this.preventBlurHide = true; - setTimeout( function() { - self.preventBlurHide = false; - }, 0 ); - }, - - enable: function() { - this.$element.removeClass( 'disabled' ); - this.$element.find( 'input, button' ).removeAttr( 'disabled' ); - }, - - formatDate: function( date ) { - var padTwo = function( value ) { - var s = '0' + value; - return s.substr( s.length - 2 ); - }; - - if ( this.moment ) { - return moment( date ).format( this.momentFormat ); - } else { - return padTwo( date.getMonth() + 1 ) + '/' + padTwo( date.getDate() ) + '/' + date.getFullYear(); - } - }, - - getCulture: function() { - if ( this.moment ) { - return moment.lang(); - } else { - throw MOMENT_NOT_AVAILABLE; - } - }, - - getDate: function() { - return ( !this.selectedDate ) ? new Date( NaN ) : this.selectedDate; - }, - - getFormat: function() { - if ( this.moment ) { - return this.momentFormat; - } else { - throw MOMENT_NOT_AVAILABLE; - } - }, - - getFormattedDate: function() { - return ( !this.selectedDate ) ? INVALID_DATE : this.formatDate( this.selectedDate ); - }, - - getRestrictedDates: function() { - return this.restricted; - }, - - inputBlurred: function( e ) { - var inputVal = this.$input.val(); - var date; - if ( inputVal !== this.inputValue ) { - date = this.setDate( inputVal ); - if ( date === null ) { - this.$element.trigger( 'inputParsingFailed.fu.datepicker', inputVal ); - } else if ( date === false ) { - this.$element.trigger( 'inputRestrictedDate.fu.datepicker', date ); - } else { - this.$element.trigger( 'changed.fu.datepicker', date ); - } - } - if ( !this.preventBlurHide ) { - this.$element.find( '.input-group-btn' ).removeClass( 'open' ); - } - }, - - inputFocused: function( e ) { - this.$element.find( '.input-group-btn' ).addClass( 'open' ); - }, - - isInvalidDate: function( date ) { - var dateString = date.toString(); - if ( dateString === INVALID_DATE || dateString === 'NaN' ) { - return true; - } - return false; - }, - - isRestricted: function( date, month, year ) { - var restricted = this.restrictedParsed; - var i, from, l, to; - - if ( this.sameYearOnly && this.yearRestriction !== null && year !== this.yearRestriction ) { - return true; - } - for ( i = 0, l = restricted.length; i < l; i++ ) { - from = restricted[ i ].from; - to = restricted[ i ].to; - if ( - ( year > from.year || ( year === from.year && month > from.month ) || ( year === from.year && month === from.month && date >= from.date ) ) && - ( year < to.year || ( year === to.year && month < to.month ) || ( year === to.year && month === to.month && date <= to.date ) ) - ) { - return true; - } - } - - return false; - }, - - monthClicked: function( e ) { - this.$wheelsMonth.find( '.selected' ).removeClass( 'selected' ); - $( e.currentTarget ).parent().addClass( 'selected' ); - }, - - next: function() { - var month = this.$headerTitle.attr( 'data-month' ); - var year = this.$headerTitle.attr( 'data-year' ); - month++; - if ( month > 11 ) { - if ( this.sameYearOnly ) { - return; - } - month = 0; - year++; - } - this.renderMonth( new Date( year, month, 1 ) ); - }, - - onYearScroll: function( e ) { - if ( this.artificialScrolling ) { - return; - } - - var $yearUl = $( e.currentTarget ); - var height = ( $yearUl.css( 'box-sizing' ) === 'border-box' ) ? $yearUl.outerHeight() : $yearUl.height(); - var scrollHeight = $yearUl.get( 0 ).scrollHeight; - var scrollTop = $yearUl.scrollTop(); - var bottomPercentage = ( height / ( scrollHeight - scrollTop ) ) * 100; - var topPercentage = ( scrollTop / scrollHeight ) * 100; - var i, start; - - if ( topPercentage < 5 ) { - start = parseInt( $yearUl.find( 'li:first' ).attr( 'data-year' ), 10 ); - for ( i = ( start - 1 ); i > ( start - 11 ); i-- ) { - $yearUl.prepend( '<li data-year="' + i + '"><button type="button">' + i + '</button></li>' ); - } - this.artificialScrolling = true; - $yearUl.scrollTop( ( $yearUl.get( 0 ).scrollHeight - scrollHeight ) + scrollTop ); - this.artificialScrolling = false; - } else if ( bottomPercentage > 90 ) { - start = parseInt( $yearUl.find( 'li:last' ).attr( 'data-year' ), 10 ); - for ( i = ( start + 1 ); i < ( start + 11 ); i++ ) { - $yearUl.append( '<li data-year="' + i + '"><button type="button">' + i + '</button></li>' ); - } - } - }, - - //some code ripped from http://stackoverflow.com/questions/2182246/javascript-dates-in-ie-nan-firefox-chrome-ok - parseDate: function( date ) { - var self = this; - var dt, isoExp, momentParse, month, parts, use; - - if ( date ) { - if ( this.moment ) { //if we have moment, use that to parse the dates - momentParse = function( type, d ) { - d = ( type === 'b' ) ? moment( d, self.momentFormat ) : moment( d ); - return ( d.isValid() === true ) ? d.toDate() : new Date( NaN ); - }; - use = ( typeof( date ) === 'string' ) ? [ 'b', 'a' ] : [ 'a', 'b' ]; - dt = momentParse( use[ 0 ], date ); - if ( !this.isInvalidDate( dt ) ) { - return dt; - } else { - dt = momentParse( use[ 1 ], date ); - if ( !this.isInvalidDate( dt ) ) { - return dt; - } - } - } else { //if moment isn't present, use previous date parsing strategy - if ( typeof( date ) === 'string' ) { - dt = new Date( Date.parse( date ) ); - if ( !this.isInvalidDate( dt ) ) { - return dt; - } else { - date = date.split( 'T' )[ 0 ]; - isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/; - parts = isoExp.exec( date ); - if ( parts ) { - month = parseInt( parts[ 2 ], 10 ); - dt = new Date( parts[ 1 ], month - 1, parts[ 3 ] ); - if ( month === ( dt.getMonth() + 1 ) ) { - return dt; - } - } - } - } else { - dt = new Date( date ); - if ( !this.isInvalidDate( dt ) ) { - return dt; - } - } - } - } - return new Date( NaN ); - }, - - prev: function() { - var month = this.$headerTitle.attr( 'data-month' ); - var year = this.$headerTitle.attr( 'data-year' ); - month--; - if ( month < 0 ) { - if ( this.sameYearOnly ) { - return; - } - month = 11; - year--; - } - this.renderMonth( new Date( year, month, 1 ) ); - }, - - renderMonth: function( date ) { - date = date || new Date(); - - var firstDay = new Date( date.getFullYear(), date.getMonth(), 1 ).getDay(); - var lastDate = new Date( date.getFullYear(), date.getMonth() + 1, 0 ).getDate(); - var lastMonthDate = new Date( date.getFullYear(), date.getMonth(), 0 ).getDate(); - var $month = this.$headerTitle.find( '.month' ); - var month = date.getMonth(); - var now = new Date(); - var nowDate = now.getDate(); - var nowMonth = now.getMonth(); - var nowYear = now.getFullYear(); - var selected = this.selectedDate; - var $tbody = this.$days.find( 'tbody' ); - var year = date.getFullYear(); - var curDate, curMonth, curYear, i, j, rows, stage, $td, $tr; - - if ( selected ) { - selected = { - date: selected.getDate(), - month: selected.getMonth(), - year: selected.getFullYear() - }; - } - - $month.find( '.current' ).removeClass( 'current' ); - $month.find( 'span[data-month="' + month + '"]' ).addClass( 'current' ); - this.$headerTitle.find( '.year' ).text( year ); - this.$headerTitle.attr( { - 'data-month': month, - 'data-year': year - } ); - - $tbody.empty(); - if ( firstDay !== 0 ) { - curDate = lastMonthDate - firstDay + 1; - stage = -1; - } else { - curDate = 1; - stage = 0; - } - rows = ( lastDate <= ( 35 - firstDay ) ) ? 5 : 6; - for ( i = 0; i < rows; i++ ) { - $tr = $( '<tr></tr>' ); - for ( j = 0; j < 7; j++ ) { - $td = $( '<td><span><button type="button" class="datepicker-date">' + curDate + '</button></span></td>' ); - if ( stage === -1 ) { - $td.addClass( 'last-month' ); - } else if ( stage === 1 ) { - $td.addClass( 'next-month' ); - } - - curMonth = month + stage; - curYear = year; - if ( curMonth < 0 ) { - curMonth = 11; - curYear--; - } else if ( curMonth > 11 ) { - curMonth = 0; - curYear++; - } - - $td.attr( { - 'data-date': curDate, - 'data-month': curMonth, - 'data-year': curYear - } ); - if ( curYear === nowYear && curMonth === nowMonth && curDate === nowDate ) { - $td.addClass( 'current-day' ); - } else if ( curYear < nowYear || ( curYear === nowYear && curMonth < nowMonth ) || - ( curYear === nowYear && curMonth === nowMonth && curDate < nowDate ) ) { - $td.addClass( 'past' ); - if ( !this.options.allowPastDates ) { - $td.addClass( 'restricted' ).attr( 'title', this.restrictedText ); - } - } - if ( this.isRestricted( curDate, curMonth, curYear ) ) { - $td.addClass( 'restricted' ).attr( 'title', this.restrictedText ); - } - if ( selected && curYear === selected.year && curMonth === selected.month && curDate === selected.date ) { - $td.addClass( 'selected' ); - } - - curDate++; - if ( stage === -1 && curDate > lastMonthDate ) { - curDate = 1; - stage = 0; - } else if ( stage === 0 && curDate > lastDate ) { - curDate = 1; - stage = 1; - } - - $tr.append( $td ); - } - $tbody.append( $tr ); - } - }, - - renderWheel: function( date ) { - var month = date.getMonth(); - var $monthUl = this.$wheelsMonth.find( 'ul' ); - var year = date.getFullYear(); - var $yearUl = this.$wheelsYear.find( 'ul' ); - var i, $monthSelected, $yearSelected; - - if ( this.sameYearOnly ) { - this.$wheelsMonth.addClass( 'full' ); - this.$wheelsYear.addClass( 'hide' ); - } else { - this.$wheelsMonth.removeClass( 'full' ); - this.$wheelsYear.removeClass( 'hide' ); - } - - $monthUl.find( '.selected' ).removeClass( 'selected' ); - $monthSelected = $monthUl.find( 'li[data-month="' + month + '"]' ); - $monthSelected.addClass( 'selected' ); - $monthUl.scrollTop( $monthUl.scrollTop() + ( $monthSelected.position().top - $monthUl.outerHeight() / 2 - $monthSelected.outerHeight( true ) / 2 ) ); - - $yearUl.empty(); - for ( i = ( year - 10 ); i < ( year + 11 ); i++ ) { - $yearUl.append( '<li data-year="' + i + '"><button type="button">' + i + '</button></li>' ); - } - $yearSelected = $yearUl.find( 'li[data-year="' + year + '"]' ); - $yearSelected.addClass( 'selected' ); - this.artificialScrolling = true; - $yearUl.scrollTop( $yearUl.scrollTop() + ( $yearSelected.position().top - $yearUl.outerHeight() / 2 - $yearSelected.outerHeight( true ) / 2 ) ); - this.artificialScrolling = false; - $monthSelected.find( 'button' ).focus(); - }, - - selectClicked: function() { - var month = this.$wheelsMonth.find( '.selected' ).attr( 'data-month' ); - var year = this.$wheelsYear.find( '.selected' ).attr( 'data-year' ); - this.changeView( 'calendar', new Date( year, month, 1 ) ); - }, - - setCulture: function( cultureCode ) { - if ( !cultureCode ) { - return false; - } - if ( this.moment ) { - moment.lang( cultureCode ); - } else { - throw MOMENT_NOT_AVAILABLE; - } - }, - - setDate: function( date ) { - var parsed = this.parseDate( date ); - if ( !this.isInvalidDate( parsed ) ) { - if ( !this.isRestricted( parsed.getDate(), parsed.getMonth(), parsed.getFullYear() ) ) { - this.selectedDate = parsed; - this.renderMonth( parsed ); - this.$input.val( this.formatDate( parsed ) ); - } else { - this.selectedDate = false; - this.renderMonth(); - } - } else { - this.selectedDate = null; - this.renderMonth(); - } - this.inputValue = this.$input.val(); - return this.selectedDate; - }, - - setFormat: function( format ) { - if ( !format ) { - return false; - } - if ( this.moment ) { - this.momentFormat = format; - } else { - throw MOMENT_NOT_AVAILABLE; - } - }, - - setRestrictedDates: function( restricted ) { - var parsed = []; - var self = this; - var i, l; - - var parseItem = function( val ) { - if ( val === -Infinity ) { - return { - date: -Infinity, - month: -Infinity, - year: -Infinity - }; - } else if ( val === Infinity ) { - return { - date: Infinity, - month: Infinity, - year: Infinity - }; - } else { - val = self.parseDate( val ); - return { - date: val.getDate(), - month: val.getMonth(), - year: val.getFullYear() - }; - } - }; - - this.restricted = restricted; - for ( i = 0, l = restricted.length; i < l; i++ ) { - parsed.push( { - from: parseItem( restricted[ i ].from ), - to: parseItem( restricted[ i ].to ) - } ); - } - this.restrictedParsed = parsed; - }, - - titleClicked: function( e ) { - this.changeView( 'wheels', new Date( this.$headerTitle.attr( 'data-year' ), this.$headerTitle.attr( 'data-month' ), 1 ) ); - }, - - todayClicked: function( e ) { - var date = new Date(); - - if ( ( date.getMonth() + '' ) !== this.$headerTitle.attr( 'data-month' ) || ( date.getFullYear() + '' ) !== this.$headerTitle.attr( 'data-year' ) ) { - this.renderMonth( date ); - } - }, - - yearClicked: function( e ) { - this.$wheelsYear.find( '.selected' ).removeClass( 'selected' ); - $( e.currentTarget ).parent().addClass( 'selected' ); - } - }; - - - // DATEPICKER PLUGIN DEFINITION - - $.fn.datepicker = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.datepicker' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.datepicker', ( data = new Datepicker( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.datepicker.defaults = { - allowPastDates: false, - date: new Date(), - formatDate: null, - momentConfig: { - culture: 'en', - format: 'L' // more formats can be found here http://momentjs.com/docs/#/customization/long-date-formats/. - }, - parseDate: null, - restricted: [], //accepts an array of objects formatted as so: { from: {{date}}, to: {{date}} } (ex: [ { from: new Date('12/11/2014'), to: new Date('03/31/2015') } ]) - restrictedText: 'Restricted', - sameYearOnly: false - }; - - $.fn.datepicker.Constructor = Datepicker; - - $.fn.datepicker.noConflict = function() { - $.fn.datepicker = old; - return this; - }; - - // DATA-API - - $( document ).on( 'mousedown.fu.datepicker.data-api', '[data-initialize=datepicker]', function( e ) { - var $control = $( e.target ).closest( '.datepicker' ); - if ( !$control.data( 'datepicker' ) ) { - $control.datepicker( $control.data() ); - } - } ); - - //used to prevent the dropdown from closing when clicking within it's bounds - $( document ).on( 'click.fu.datepicker.data-api', '.datepicker .dropdown-menu', function( e ) { - var $target = $( e.target ); - if ( !$target.is( '.datepicker-date' ) || $target.closest( '.restricted' ).length ) { - e.stopPropagation(); - } - } ); - - //used to prevent the dropdown from closing when clicking on the input - $( document ).on( 'click.fu.datepicker.data-api', '.datepicker input', function( e ) { - e.stopPropagation(); - } ); - - $( function() { - $( '[data-initialize=datepicker]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'datepicker' ) ) { - return; - } - $this.datepicker( $this.data() ); - } ); - } ); - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Dropdown Auto Flip - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - $( document.body ).on( 'click.fu.dropdown-autoflip', '[data-toggle=dropdown][data-flip]', function( event ) { - if ( $( this ).data().flip === "auto" ) { - // have the drop down decide where to place itself - _autoFlip( $( this ).next( '.dropdown-menu' ) ); - } - } ); - - // For pillbox suggestions dropdown - $( document.body ).on( 'suggested.fu.pillbox', function( event, element ) { - _autoFlip( $( element ) ); - $( element ).parent().addClass( 'open' ); - } ); - - function _autoFlip( menu ) { - // hide while the browser thinks - $( menu ).css( { - visibility: "hidden" - } ); - - // decide where to put menu - if ( dropUpCheck( menu ) ) { - menu.parent().addClass( "dropup" ); - } else { - menu.parent().removeClass( "dropup" ); - } - - // show again - $( menu ).css( { - visibility: "visible" - } ); - } - - function dropUpCheck( element ) { - // caching container - var $container = _getContainer( element ); - - // building object with measurementsances for later use - var measurements = {}; - measurements.parentHeight = element.parent().outerHeight(); - measurements.parentOffsetTop = element.parent().offset().top; - measurements.dropdownHeight = element.outerHeight(); - measurements.containerHeight = $container.overflowElement.outerHeight(); - - // this needs to be different if the window is the container or another element is - measurements.containerOffsetTop = ( !!$container.isWindow ) ? $container.overflowElement.scrollTop() : $container.overflowElement.offset().top; - - // doing the calculations - measurements.fromTop = measurements.parentOffsetTop - measurements.containerOffsetTop; - measurements.fromBottom = measurements.containerHeight - measurements.parentHeight - ( measurements.parentOffsetTop - measurements.containerOffsetTop ); - - // actual determination of where to put menu - // false = drop down - // true = drop up - if ( measurements.dropdownHeight < measurements.fromBottom ) { - return false; - } else if ( measurements.dropdownHeight < measurements.fromTop ) { - return true; - } else if ( measurements.dropdownHeight >= measurements.fromTop && measurements.dropdownHeight >= measurements.fromBottom ) { - // decide which one is bigger and put it there - if ( measurements.fromTop >= measurements.fromBottom ) { - return true; - } else { - return false; - } - } - } - - function _getContainer( element ) { - var containerElement = window; - var isWindow = true; - - $.each( element.parents(), function( index, value ) { - if ( $( value ).css( 'overflow' ) !== 'visible' ) { - containerElement = value; - isWindow = false; - return false; - } - } ); - - return { - overflowElement: $( containerElement ), - isWindow: isWindow - }; - } - - // register empty plugin - $.fn.dropdownautoflip = function() { /* empty */ }; - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Loader - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.loader; - - // LOADER CONSTRUCTOR AND PROTOTYPE - - var Loader = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.loader.defaults, options ); - - this.begin = ( this.$element.is( '[data-begin]' ) ) ? parseInt( this.$element.attr( 'data-begin' ), 10 ) : 1; - this.delay = ( this.$element.is( '[data-delay]' ) ) ? parseFloat( this.$element.attr( 'data-delay' ) ) : 150; - this.end = ( this.$element.is( '[data-end]' ) ) ? parseInt( this.$element.attr( 'data-end' ), 10 ) : 8; - this.frame = ( this.$element.is( '[data-frame]' ) ) ? parseInt( this.$element.attr( 'data-frame' ), 10 ) : this.begin; - this.isIElt9 = false; - this.timeout = {}; - - var ieVer = this.msieVersion(); - if ( ieVer !== false && ieVer < 9 ) { - this.$element.addClass( 'iefix' ); - this.isIElt9 = true; - } - - this.$element.attr( 'data-frame', this.frame + '' ); - this.play(); - }; - - Loader.prototype = { - - constructor: Loader, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - // empty elements to return to original markup - // [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - ieRepaint: function() { - if ( this.isIElt9 ) { - this.$element.addClass( 'iefix_repaint' ).removeClass( 'iefix_repaint' ); - } - }, - - msieVersion: function() { - var ua = window.navigator.userAgent; - var msie = ua.indexOf( 'MSIE ' ); - if ( msie > 0 ) { - return parseInt( ua.substring( msie + 5, ua.indexOf( ".", msie ) ), 10 ); - } else { - return false; - } - }, - - next: function() { - this.frame++; - if ( this.frame > this.end ) { - this.frame = this.begin; - } - this.$element.attr( 'data-frame', this.frame + '' ); - this.ieRepaint(); - }, - - pause: function() { - clearTimeout( this.timeout ); - }, - - play: function() { - var self = this; - clearTimeout( this.timeout ); - this.timeout = setTimeout( function() { - self.next(); - self.play(); - }, this.delay ); - }, - - previous: function() { - this.frame--; - if ( this.frame < this.begin ) { - this.frame = this.end; - } - this.$element.attr( 'data-frame', this.frame + '' ); - this.ieRepaint(); - }, - - reset: function() { - this.frame = this.begin; - this.$element.attr( 'data-frame', this.frame + '' ); - this.ieRepaint(); - } - - }; - - // LOADER PLUGIN DEFINITION - - $.fn.loader = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.loader' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.loader', ( data = new Loader( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.loader.defaults = {}; - - $.fn.loader.Constructor = Loader; - - $.fn.loader.noConflict = function() { - $.fn.loader = old; - return this; - }; - - // INIT LOADER ON DOMCONTENTLOADED - - $( function() { - $( '[data-initialize=loader]' ).each( function() { - var $this = $( this ); - if ( !$this.data( 'fu.loader' ) ) { - $this.loader( $this.data() ); - } - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Placard - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.placard; - - // PLACARD CONSTRUCTOR AND PROTOTYPE - - var Placard = function( element, options ) { - var self = this; - this.$element = $( element ); - this.options = $.extend( {}, $.fn.placard.defaults, options ); - - this.$accept = this.$element.find( '.placard-accept' ); - this.$cancel = this.$element.find( '.placard-cancel' ); - this.$field = this.$element.find( '.placard-field' ); - this.$footer = this.$element.find( '.placard-footer' ); - this.$header = this.$element.find( '.placard-header' ); - this.$popup = this.$element.find( '.placard-popup' ); - - this.actualValue = null; - this.clickStamp = '_'; - this.previousValue = ''; - if ( this.options.revertOnCancel === -1 ) { - this.options.revertOnCancel = ( this.$accept.length > 0 ) ? true : false; - } - - this.$field.on( 'focus.fu.placard', $.proxy( this.show, this ) ); - this.$accept.on( 'click.fu.placard', $.proxy( this.complete, this, 'accept' ) ); - this.$cancel.on( 'click.fu.placard', function( e ) { - e.preventDefault(); - self.complete( 'cancel' ); - } ); - - this.ellipsis(); - }; - - Placard.prototype = { - constructor: Placard, - - complete: function( action ) { - var func = this.options[ 'on' + action[ 0 ].toUpperCase() + action.substring( 1 ) ]; - var obj = { - previousValue: this.previousValue, - value: this.$field.val() - }; - if ( func ) { - func( obj ); - this.$element.trigger( action, obj ); - } else { - if ( action === 'cancel' && this.options.revertOnCancel ) { - this.$field.val( this.previousValue ); - } - this.$element.trigger( action, obj ); - this.hide(); - } - }, - - destroy: function() { - this.$element.remove(); - // remove any external bindings - $( document ).off( 'click.fu.placard.externalClick.' + this.clickStamp ); - // set input value attrbute - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - // empty elements to return to original markup - // [none] - // return string of markup - return this.$element[ 0 ].outerHTML; - }, - - disable: function() { - this.$element.addClass( 'disabled' ); - this.$field.attr( 'disabled', 'disabled' ); - this.hide(); - }, - - ellipsis: function() { - var field, i, str; - if ( this.$element.attr( 'data-ellipsis' ) === 'true' ) { - field = this.$field.get( 0 ); - if ( this.$field.is( 'input' ) ) { - field.scrollLeft = 0; - } else { - field.scrollTop = 0; - if ( field.clientHeight < field.scrollHeight ) { - this.actualValue = this.$field.val(); - this.$field.val( '' ); - str = ''; - i = 0; - while ( field.clientHeight >= field.scrollHeight ) { - str += this.actualValue[ i ]; - this.$field.val( str + '...' ); - i++; - } - str = ( str.length > 0 ) ? str.substring( 0, str.length - 1 ) : ''; - this.$field.val( str + '...' ); - } - } - } - }, - - enable: function() { - this.$element.removeClass( 'disabled' ); - this.$field.removeAttr( 'disabled' ); - }, - - externalClickListener: function( e, force ) { - if ( force === true || this.isExternalClick( e ) ) { - this.complete( this.options.externalClickAction ); - } - }, - - getValue: function() { - if ( this.actualValue !== null ) { - return this.actualValue; - } else { - return this.$field.val(); - } - }, - - hide: function() { - if ( !this.$element.hasClass( 'showing' ) ) { - return; - } - this.$element.removeClass( 'showing' ); - this.ellipsis(); - $( document ).off( 'click.fu.placard.externalClick.' + this.clickStamp ); - this.$element.trigger( 'hidden.fu.placard' ); - }, - - isExternalClick: function( e ) { - var el = this.$element.get( 0 ); - var exceptions = this.options.externalClickExceptions || []; - var $originEl = $( e.target ); - var i, l; - - if ( e.target === el || $originEl.parents( '.placard:first' ).get( 0 ) === el ) { - return false; - } else { - for ( i = 0, l = exceptions.length; i < l; i++ ) { - if ( $originEl.is( exceptions[ i ] ) || $originEl.parents( exceptions[ i ] ).length > 0 ) { - return false; - } - } - } - return true; - }, - - setValue: function( val ) { - this.$field.val( val ); - if ( !this.$element.hasClass( 'showing' ) ) { - this.ellipsis(); - } - }, - - show: function() { - var other; - - if ( this.$element.hasClass( 'showing' ) ) { - return; - } - other = $( document ).find( '.placard.showing' ); - if ( other.length > 0 ) { - if ( other.data( 'fu.placard' ) && other.data( 'fu.placard' ).options.explicit ) { - return; - } - other.placard( 'externalClickListener', {}, true ); - } - this.previousValue = this.$field.val(); - - this.$element.addClass( 'showing' ); - if ( this.actualValue !== null ) { - this.$field.val( this.actualValue ); - this.actualValue = null; - } - if ( this.$header.length > 0 ) { - this.$popup.css( 'top', '-' + this.$header.outerHeight( true ) + 'px' ); - } - if ( this.$footer.length > 0 ) { - this.$popup.css( 'bottom', '-' + this.$footer.outerHeight( true ) + 'px' ); - } - - this.$element.trigger( 'shown.fu.placard' ); - this.clickStamp = new Date().getTime() + ( Math.floor( Math.random() * 100 ) + 1 ); - if ( !this.options.explicit ) { - $( document ).on( 'click.fu.placard.externalClick.' + this.clickStamp, $.proxy( this.externalClickListener, this ) ); - } - } - }; - - // PLACARD PLUGIN DEFINITION - - $.fn.placard = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.placard' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.placard', ( data = new Placard( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.placard.defaults = { - onAccept: undefined, - onCancel: undefined, - externalClickAction: 'cancel', - externalClickExceptions: [], - explicit: false, - revertOnCancel: -1 //negative 1 will check for an '.placard-accept' button. Also can be set to true or false - }; - - $.fn.placard.Constructor = Placard; - - $.fn.placard.noConflict = function() { - $.fn.placard = old; - return this; - }; - - // DATA-API - - $( document ).on( 'focus.fu.placard.data-api', '[data-initialize=placard]', function( e ) { - var $control = $( e.target ).closest( '.placard' ); - if ( !$control.data( 'fu.placard' ) ) { - $control.placard( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=placard]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'fu.placard' ) ) return; - $this.placard( $this.data() ); - } ); - } ); - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Radio - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.radio; - - // RADIO CONSTRUCTOR AND PROTOTYPE - - var Radio = function( element, options ) { - this.options = $.extend( {}, $.fn.radio.defaults, options ); - - // cache elements - this.$radio = $( element ).is( 'input[type="radio"]' ) ? $( element ) : $( element ).find( 'input[type="radio"]:first' ); - this.$label = this.$radio.parent(); - this.groupName = this.$radio.attr( 'name' ); - this.$parent = this.$label.parent( '.radio' ); - this.$toggleContainer = null; - - if ( this.$parent.length === 0 ) { - this.$parent = null; - } - - var toggleSelector = this.$radio.attr( 'data-toggle' ); - if ( toggleSelector ) { - this.$toggleContainer = $( toggleSelector ); - } - - // set default state - this.setState( this.$radio ); - - // handle events - this.$radio.on( 'change.fu.radio', $.proxy( this.itemchecked, this ) ); - }; - - Radio.prototype = { - - constructor: Radio, - - destroy: function() { - this.$parent.remove(); - // remove any external bindings - // [none] - // empty elements to return to original markup - // [none] - // return string of markup - return this.$parent[ 0 ].outerHTML; - }, - - setState: function( $radio ) { - $radio = $radio || this.$radio; - - var checked = $radio.is( ':checked' ); - var disabled = !!$radio.prop( 'disabled' ); - - this.$label.removeClass( 'checked' ); - if ( this.$parent ) { - this.$parent.removeClass( 'checked disabled' ); - } - - // set state of radio - if ( checked === true ) { - this.$label.addClass( 'checked' ); - if ( this.$parent ) { - this.$parent.addClass( 'checked' ); - } - } - if ( disabled === true ) { - this.$label.addClass( 'disabled' ); - if ( this.$parent ) { - this.$parent.addClass( 'disabled' ); - } - } - - //toggle container - this.toggleContainer(); - }, - - resetGroup: function() { - var group = $( 'input[name="' + this.groupName + '"]' ); - - group.each( function() { - var lbl = $( this ).parent( 'label' ); - lbl.removeClass( 'checked' ); - lbl.parent( '.radio' ).removeClass( 'checked' ); - } ); - }, - - enable: function() { - this.$radio.attr( 'disabled', false ); - this.$label.removeClass( 'disabled' ); - if ( this.$parent ) { - this.$parent.removeClass( 'disabled' ); - } - }, - - disable: function() { - this.$radio.attr( 'disabled', true ); - this.$label.addClass( 'disabled' ); - if ( this.$parent ) { - this.$parent.addClass( 'disabled' ); - } - }, - - itemchecked: function( e ) { - var radio = $( e.target ); - - this.resetGroup(); - this.setState( radio ); - }, - - check: function() { - this.resetGroup(); - this.$radio.prop( 'checked', true ); - this.setState( this.$radio ); - }, - - toggleContainer: function() { - var group; - if ( this.$toggleContainer ) { - // show corresponding container for currently selected radio - if ( this.isChecked() ) { - // hide containers for each item in group - group = $( 'input[name="' + this.groupName + '"]' ); - group.each( function() { - var selector = $( this ).attr( 'data-toggle' ); - $( selector ).addClass( 'hide' ); - $( selector ).attr( 'aria-hidden', 'true' ); - } ); - this.$toggleContainer.removeClass( 'hide' ); - this.$toggleContainer.attr( 'aria-hidden', 'false' ); - } else { - this.$toggleContainer.addClass( 'hide' ); - this.$toggleContainer.attr( 'aria-hidden', 'true' ); - } - - } - }, - - uncheck: function() { - this.$radio.prop( 'checked', false ); - this.setState( this.$radio ); - }, - - isChecked: function() { - return this.$radio.is( ':checked' ); - } - }; - - - // RADIO PLUGIN DEFINITION - - $.fn.radio = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.radio' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.radio', ( data = new Radio( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.radio.defaults = {}; - - $.fn.radio.Constructor = Radio; - - $.fn.radio.noConflict = function() { - $.fn.radio = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mouseover.fu.checkbox.data-api', '[data-initialize=radio]', function( e ) { - var $control = $( e.target ).closest( '.radio' ).find( '[type=radio]' ); - if ( !$control.data( 'fu.radio' ) ) { - $control.radio( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=radio] [type=radio]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'fu.radio' ) ) return; - $this.radio( $this.data() ); - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Search - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.search; - - // SEARCH CONSTRUCTOR AND PROTOTYPE - - var Search = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.search.defaults, options ); - - this.$button = this.$element.find( 'button' ); - this.$input = this.$element.find( 'input' ); - this.$icon = this.$element.find( '.glyphicon' ); - - this.$button.on( 'click.fu.search', $.proxy( this.buttonclicked, this ) ); - this.$input.on( 'keydown.fu.search', $.proxy( this.keypress, this ) ); - this.$input.on( 'keyup.fu.search', $.proxy( this.keypressed, this ) ); - - this.activeSearch = ''; - }; - - Search.prototype = { - - constructor: Search, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - // set input value attrbute - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - // empty elements to return to original markup - // [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - search: function( searchText ) { - if ( this.$icon.hasClass( 'glyphicon' ) ) { - this.$icon.removeClass( 'glyphicon-search' ).addClass( 'glyphicon-remove' ); - } - this.activeSearch = searchText; - this.$element.addClass( 'searched' ); - this.$element.trigger( 'searched.fu.search', searchText ); - }, - - clear: function() { - if ( this.$icon.hasClass( 'glyphicon' ) ) { - this.$icon.removeClass( 'glyphicon-remove' ).addClass( 'glyphicon-search' ); - } - this.activeSearch = ''; - this.$input.val( '' ); - this.$element.removeClass( 'searched' ); - this.$element.trigger( 'cleared.fu.search' ); - }, - - action: function() { - var val = this.$input.val(); - var inputEmptyOrUnchanged = val === '' || val === this.activeSearch; - - if ( this.activeSearch && inputEmptyOrUnchanged ) { - this.clear(); - } else if ( val ) { - this.search( val ); - } - }, - - buttonclicked: function( e ) { - e.preventDefault(); - if ( $( e.currentTarget ).is( '.disabled, :disabled' ) ) return; - this.action(); - }, - - keypress: function( e ) { - if ( e.which === 13 ) { - e.preventDefault(); - } - }, - - keypressed: function( e ) { - var val, inputPresentAndUnchanged; - - if ( e.which === 13 ) { - e.preventDefault(); - this.action(); - } else { - val = this.$input.val(); - inputPresentAndUnchanged = val && ( val === this.activeSearch ); - this.$icon.attr( 'class', inputPresentAndUnchanged ? 'glyphicon glyphicon-remove' : 'glyphicon glyphicon-search' ); - } - }, - - disable: function() { - this.$element.addClass( 'disabled' ); - this.$input.attr( 'disabled', 'disabled' ); - this.$button.addClass( 'disabled' ); - }, - - enable: function() { - this.$element.removeClass( 'disabled' ); - this.$input.removeAttr( 'disabled' ); - this.$button.removeClass( 'disabled' ); - } - - }; - - - // SEARCH PLUGIN DEFINITION - - $.fn.search = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.search' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.search', ( data = new Search( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.search.defaults = {}; - - $.fn.search.Constructor = Search; - - $.fn.search.noConflict = function() { - $.fn.search = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mousedown.fu.search.data-api', '[data-initialize=search]', function( e ) { - var $control = $( e.target ).closest( '.search' ); - if ( !$control.data( 'fu.search' ) ) { - $control.search( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=search]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'fu.search' ) ) return; - $this.search( $this.data() ); - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Button Dropdown - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.selectlist; - // SELECT CONSTRUCTOR AND PROTOTYPE - - var Selectlist = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.selectlist.defaults, options ); - - this.$button = this.$element.find( '.btn.dropdown-toggle' ); - this.$hiddenField = this.$element.find( '.hidden-field' ); - this.$label = this.$element.find( '.selected-label' ); - - this.$element.on( 'click.fu.selectlist', '.dropdown-menu a', $.proxy( this.itemClicked, this ) ); - this.setDefaultSelection(); - - if ( options.resize === 'auto' ) { - this.resize(); - } - }; - - Selectlist.prototype = { - - constructor: Selectlist, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - // empty elements to return to original markup - // [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - doSelect: function( $item ) { - var $selectedItem; - this.$selectedItem = $selectedItem = $item; - - this.$hiddenField.val( this.$selectedItem.attr( 'data-value' ) ); - this.$label.html( $( this.$selectedItem.children()[ 0 ] ).html() ); - - // clear and set selected item to allow declarative init state - // unlike other controls, selectlist's value is stored internal, not in an input - this.$element.find( 'li' ).each( function() { - if ( $selectedItem.is( $( this ) ) ) { - $( this ).attr( 'data-selected', true ); - } else { - $( this ).removeData( 'selected' ).removeAttr( 'data-selected' ); - } - } ); - - }, - - itemClicked: function( e ) { - this.$element.trigger( 'clicked.fu.selectlist', this.$selectedItem ); - - e.preventDefault(); - - // is clicked element different from currently selected element? - if ( !( $( e.target ).parent().is( this.$selectedItem ) ) ) { - this.itemChanged( e ); - } - - // return focus to control after selecting an option - this.$element.find( '.dropdown-toggle' ).focus(); - - }, - - itemChanged: function( e ) { - - this.doSelect( $( e.target ).parent() ); - - // pass object including text and any data-attributes - // to onchange event - var data = this.selectedItem(); - // trigger changed event - this.$element.trigger( 'changed.fu.selectlist', data ); - }, - - resize: function() { - var newWidth = 0; - var sizer = $( '<div/>' ).addClass( 'selectlist-sizer' ); - var width = 0; - - if ( Boolean( $( document ).find( 'html' ).hasClass( 'fuelux' ) ) ) { - // default behavior for fuel ux setup. means fuelux was a class on the html tag - $( document.body ).append( sizer ); - } else { - // fuelux is not a class on the html tag. So we'll look for the first one we find so the correct styles get applied to the sizer - $( '.fuelux:first' ).append( sizer ); - } - - // iterate through each item to find longest string - this.$element.find( 'a' ).each( function() { - sizer.text( $( this ).text() ); - newWidth = sizer.outerWidth(); - if ( newWidth > width ) { - width = newWidth; - } - } ); - - sizer.remove(); - - //TODO: betting this is somewhat off with box-sizing: border-box - this.$label.width( width ); - }, - - selectedItem: function() { - var txt = this.$selectedItem.text(); - return $.extend( { - text: txt - }, this.$selectedItem.data() ); - }, - - selectByText: function( text ) { - var $item = $( [] ); - this.$element.find( 'li' ).each( function() { - if ( ( this.textContent || this.innerText || $( this ).text() || '' ).toLowerCase() === ( text || '' ).toLowerCase() ) { - $item = $( this ); - return false; - } - } ); - this.doSelect( $item ); - }, - - selectByValue: function( value ) { - var selector = 'li[data-value="' + value + '"]'; - this.selectBySelector( selector ); - }, - - selectByIndex: function( index ) { - // zero-based index - var selector = 'li:eq(' + index + ')'; - this.selectBySelector( selector ); - }, - - selectBySelector: function( selector ) { - var $item = this.$element.find( selector ); - this.doSelect( $item ); - }, - - setDefaultSelection: function() { - var $item = this.$element.find( 'li[data-selected=true]' ).eq( 0 ); - - if ( $item.length === 0 ) { - $item = this.$element.find( 'li' ).has( 'a' ).eq( 0 ); - } - - this.doSelect( $item ); - }, - - enable: function() { - this.$element.removeClass( 'disabled' ); - this.$button.removeClass( 'disabled' ); - }, - - disable: function() { - this.$element.addClass( 'disabled' ); - this.$button.addClass( 'disabled' ); - } - - }; - - - // SELECT PLUGIN DEFINITION - - $.fn.selectlist = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.selectlist' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.selectlist', ( data = new Selectlist( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.selectlist.defaults = {}; - - $.fn.selectlist.Constructor = Selectlist; - - $.fn.selectlist.noConflict = function() { - $.fn.selectlist = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mousedown.fu.selectlist.data-api', '[data-initialize=selectlist]', function( e ) { - var $control = $( e.target ).closest( '.selectlist' ); - if ( !$control.data( 'fu.selectlist' ) ) { - $control.selectlist( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=selectlist]' ).each( function() { - var $this = $( this ); - if ( !$this.data( 'fu.selectlist' ) ) { - $this.selectlist( $this.data() ); - } - } ); - } ); - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Spinbox - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.spinbox; - - // SPINBOX CONSTRUCTOR AND PROTOTYPE - - var Spinbox = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.spinbox.defaults, options ); - this.$input = this.$element.find( '.spinbox-input' ); - this.$element.on( 'focusin.fu.spinbox', this.$input, $.proxy( this.changeFlag, this ) ); - this.$element.on( 'focusout.fu.spinbox', this.$input, $.proxy( this.change, this ) ); - this.$element.on( 'keydown.fu.spinbox', this.$input, $.proxy( this.keydown, this ) ); - this.$element.on( 'keyup.fu.spinbox', this.$input, $.proxy( this.keyup, this ) ); - - this.bindMousewheelListeners(); - this.mousewheelTimeout = {}; - - if ( this.options.hold ) { - this.$element.on( 'mousedown.fu.spinbox', '.spinbox-up', $.proxy( function() { - this.startSpin( true ); - }, this ) ); - this.$element.on( 'mouseup.fu.spinbox', '.spinbox-up, .spinbox-down', $.proxy( this.stopSpin, this ) ); - this.$element.on( 'mouseout.fu.spinbox', '.spinbox-up, .spinbox-down', $.proxy( this.stopSpin, this ) ); - this.$element.on( 'mousedown.fu.spinbox', '.spinbox-down', $.proxy( function() { - this.startSpin( false ); - }, this ) ); - } else { - this.$element.on( 'click.fu.spinbox', '.spinbox-up', $.proxy( function() { - this.step( true ); - }, this ) ); - this.$element.on( 'click.fu.spinbox', '.spinbox-down', $.proxy( function() { - this.step( false ); - }, this ) ); - } - - this.switches = { - count: 1, - enabled: true - }; - - if ( this.options.speed === 'medium' ) { - this.switches.speed = 300; - } else if ( this.options.speed === 'fast' ) { - this.switches.speed = 100; - } else { - this.switches.speed = 500; - } - - this.lastValue = this.options.value; - - this.render(); - - if ( this.options.disabled ) { - this.disable(); - } - }; - - Spinbox.prototype = { - constructor: Spinbox, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - // set input value attrbute - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - // empty elements to return to original markup - // [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - render: function() { - var inputValue = this.parseInput( this.$input.val() ); - var maxUnitLength = ''; - - // if input is empty and option value is default, 0 - if ( inputValue !== '' && this.options.value === 0 ) { - this.value( inputValue ); - } else { - this.output( this.options.value ); - } - - if ( this.options.units.length ) { - $.each( this.options.units, function( index, value ) { - if ( value.length > maxUnitLength.length ) { - maxUnitLength = value; - } - } ); - } - - }, - - output: function( value, updateField ) { - value = ( value + '' ).split( '.' ).join( this.options.decimalMark ); - updateField = ( updateField || true ); - if ( updateField ) { - this.$input.val( value ); - } - - return value; - }, - - parseInput: function( value ) { - value = ( value + '' ).split( this.options.decimalMark ).join( '.' ); - - return value; - }, - - change: function() { - var newVal = this.parseInput( this.$input.val() ) || ''; - - if ( this.options.units.length || this.options.decimalMark !== '.' ) { - newVal = this.parseValueWithUnit( newVal ); - } else if ( newVal / 1 ) { - newVal = this.options.value = this.checkMaxMin( newVal / 1 ); - } else { - newVal = this.checkMaxMin( newVal.replace( /[^0-9.-]/g, '' ) || '' ); - this.options.value = newVal / 1; - } - this.output( newVal ); - - this.changeFlag = false; - this.triggerChangedEvent(); - }, - - changeFlag: function() { - this.changeFlag = true; - }, - - stopSpin: function() { - if ( this.switches.timeout !== undefined ) { - clearTimeout( this.switches.timeout ); - this.switches.count = 1; - this.triggerChangedEvent(); - } - }, - - triggerChangedEvent: function() { - var currentValue = this.value(); - if ( currentValue === this.lastValue ) return; - - this.lastValue = currentValue; - - // Primary changed event - this.$element.trigger( 'changed.fu.spinbox', this.output( currentValue, false ) ); // no DOM update - }, - - startSpin: function( type ) { - - if ( !this.options.disabled ) { - var divisor = this.switches.count; - - if ( divisor === 1 ) { - this.step( type ); - divisor = 1; - } else if ( divisor < 3 ) { - divisor = 1.5; - } else if ( divisor < 8 ) { - divisor = 2.5; - } else { - divisor = 4; - } - - this.switches.timeout = setTimeout( $.proxy( function() { - this.iterate( type ); - }, this ), this.switches.speed / divisor ); - this.switches.count++; - } - }, - - iterate: function( type ) { - this.step( type ); - this.startSpin( type ); - }, - - step: function( isIncrease ) { - // isIncrease: true is up, false is down - - var digits, multiple, currentValue, limitValue; - - // trigger change event - if ( this.changeFlag ) { - this.change(); - } - - // get current value and min/max options - currentValue = this.options.value; - limitValue = isIncrease ? this.options.max : this.options.min; - - if ( ( isIncrease ? currentValue < limitValue : currentValue > limitValue ) ) { - var newVal = currentValue + ( isIncrease ? 1 : -1 ) * this.options.step; - - // raise to power of 10 x number of decimal places, then round - if ( this.options.step % 1 !== 0 ) { - digits = ( this.options.step + '' ).split( '.' )[ 1 ].length; - multiple = Math.pow( 10, digits ); - newVal = Math.round( newVal * multiple ) / multiple; - } - - // if outside limits, set to limit value - if ( isIncrease ? newVal > limitValue : newVal < limitValue ) { - this.value( limitValue ); - } else { - this.value( newVal ); - } - - } else if ( this.options.cycle ) { - var cycleVal = isIncrease ? this.options.min : this.options.max; - this.value( cycleVal ); - } - }, - - value: function( value ) { - - if ( value || value === 0 ) { - if ( this.options.units.length || this.options.decimalMark !== '.' ) { - this.output( this.parseValueWithUnit( value + ( this.unit || '' ) ) ); - return this; - - } else if ( !isNaN( parseFloat( value ) ) && isFinite( value ) ) { - this.options.value = value / 1; - this.output( value + ( this.unit ? this.unit : '' ) ); - return this; - - } - } else { - if ( this.changeFlag ) { - this.change(); - } - - if ( this.unit ) { - return this.options.value + this.unit; - } else { - return this.output( this.options.value, false ); // no DOM update - } - } - }, - - isUnitLegal: function( unit ) { - var legalUnit; - - $.each( this.options.units, function( index, value ) { - if ( value.toLowerCase() === unit.toLowerCase() ) { - legalUnit = unit.toLowerCase(); - return false; - } - } ); - - return legalUnit; - }, - - // strips units and add them back - parseValueWithUnit: function( value ) { - var unit = value.replace( /[^a-zA-Z]/g, '' ); - var number = value.replace( /[^0-9.-]/g, '' ); - - if ( unit ) { - unit = this.isUnitLegal( unit ); - } - - this.options.value = this.checkMaxMin( number / 1 ); - this.unit = unit || undefined; - return this.options.value + ( unit || '' ); - }, - - checkMaxMin: function( value ) { - // if unreadable - if ( isNaN( parseFloat( value ) ) ) { - return value; - } - // if not within range return the limit - if ( !( value <= this.options.max && value >= this.options.min ) ) { - value = value >= this.options.max ? this.options.max : this.options.min; - } - return value; - }, - - disable: function() { - this.options.disabled = true; - this.$element.addClass( 'disabled' ); - this.$input.attr( 'disabled', '' ); - this.$element.find( 'button' ).addClass( 'disabled' ); - }, - - enable: function() { - this.options.disabled = false; - this.$element.removeClass( 'disabled' ); - this.$input.removeAttr( "disabled" ); - this.$element.find( 'button' ).removeClass( 'disabled' ); - }, - - keydown: function( event ) { - var keyCode = event.keyCode; - if ( keyCode === 38 ) { - this.step( true ); - } else if ( keyCode === 40 ) { - this.step( false ); - } - }, - - keyup: function( event ) { - var keyCode = event.keyCode; - - if ( keyCode === 38 || keyCode === 40 ) { - this.triggerChangedEvent(); - } - }, - - bindMousewheelListeners: function() { - var inputEl = this.$input.get( 0 ); - if ( inputEl.addEventListener ) { - //IE 9, Chrome, Safari, Opera - inputEl.addEventListener( 'mousewheel', $.proxy( this.mousewheelHandler, this ), false ); - // Firefox - inputEl.addEventListener( 'DOMMouseScroll', $.proxy( this.mousewheelHandler, this ), false ); - } else { - // IE <9 - inputEl.attachEvent( 'onmousewheel', $.proxy( this.mousewheelHandler, this ) ); - } - }, - - mousewheelHandler: function( event ) { - var e = window.event || event; // old IE support - var delta = Math.max( -1, Math.min( 1, ( e.wheelDelta || -e.detail ) ) ); - var self = this; - - clearTimeout( this.mousewheelTimeout ); - this.mousewheelTimeout = setTimeout( function() { - self.triggerChangedEvent(); - }, 300 ); - - if ( delta < 0 ) { - this.step( true ); - } else { - this.step( false ); - } - - if ( e.preventDefault ) { - e.preventDefault(); - } else { - e.returnValue = false; - } - return false; - } - }; - - - // SPINBOX PLUGIN DEFINITION - - $.fn.spinbox = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.spinbox' ); - var options = typeof option === 'object' && option; - - if ( !data ) { - $this.data( 'fu.spinbox', ( data = new Spinbox( this, options ) ) ); - } - if ( typeof option === 'string' ) { - methodReturn = data[ option ].apply( data, args ); - } - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - // value needs to be 0 for this.render(); - $.fn.spinbox.defaults = { - value: 0, - min: 0, - max: 999, - step: 1, - hold: true, - speed: 'medium', - disabled: false, - cycle: false, - units: [], - decimalMark: '.' - }; - - $.fn.spinbox.Constructor = Spinbox; - - $.fn.spinbox.noConflict = function() { - $.fn.spinbox = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mousedown.fu.spinbox.data-api', '[data-initialize=spinbox]', function( e ) { - var $control = $( e.target ).closest( '.spinbox' ); - if ( !$control.data( 'fu.spinbox' ) ) { - $control.spinbox( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=spinbox]' ).each( function() { - var $this = $( this ); - if ( !$this.data( 'fu.spinbox' ) ) { - $this.spinbox( $this.data() ); - } - } ); - } ); - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Tree - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.tree; - - // TREE CONSTRUCTOR AND PROTOTYPE - - var Tree = function( element, options ) { - this.$element = $( element ); - this.options = $.extend( {}, $.fn.tree.defaults, options ); - - this.$element.on( 'click.fu.tree', '.tree-item', $.proxy( function( ev ) { - this.selectItem( ev.currentTarget ); - }, this ) ); - this.$element.on( 'click.fu.tree', '.tree-branch-name', $.proxy( function( ev ) { - this.openFolder( ev.currentTarget ); - }, this ) ); - - if ( this.options.folderSelect ) { - this.$element.off( 'click.fu.tree', '.tree-branch-name' ); - this.$element.on( 'click.fu.tree', '.icon-caret', $.proxy( function( ev ) { - this.openFolder( $( ev.currentTarget ).parent() ); - }, this ) ); - this.$element.on( 'click.fu.tree', '.tree-branch-name', $.proxy( function( ev ) { - this.selectFolder( $( ev.currentTarget ) ); - }, this ) ); - } - - this.render(); - }; - - Tree.prototype = { - constructor: Tree, - - destroy: function() { - // any external bindings [none] - // empty elements to return to original markup - this.$element.find( "li:not([data-template])" ).remove(); - - this.$element.remove(); - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - render: function() { - this.populate( this.$element ); - }, - - populate: function( $el ) { - var self = this; - var $parent = ( $el.hasClass( 'tree' ) ) ? $el : $el.parent(); - var loader = $parent.find( '.tree-loader:eq(0)' ); - - loader.removeClass( 'hide' ); - this.options.dataSource( this.options.folderSelect ? $parent.data() : $el.data(), function( items ) { - loader.addClass( 'hide' ); - - $.each( items.data, function( index, value ) { - var $entity; - - if ( value.type === 'folder' ) { - $entity = self.$element.find( '[data-template=treebranch]:eq(0)' ).clone().removeClass( 'hide' ).removeAttr( 'data-template' ); - $entity.data( value ); - $entity.find( '.tree-branch-name > .tree-label' ).html( value.name ); - } else if ( value.type === 'item' ) { - $entity = self.$element.find( '[data-template=treeitem]:eq(0)' ).clone().removeClass( 'hide' ).removeAttr( 'data-template' ); - $entity.find( '.tree-item-name > .tree-label' ).html( value.name ); - $entity.data( value ); - } - - // Decorate $entity with data making the element - // easily accessable with libraries like jQuery. - // - // Values are contained within the object returned - // for folders and items as dataAttributes: - // - // { - // name: "An Item", - // type: 'item', - // dataAttributes = { - // 'classes': 'required-item red-text', - // 'data-parent': parentId, - // 'guid': guid, - // 'id': guid - // } - // }; - - // add attributes to tree-branch or tree-item - var dataAttributes = value.dataAttributes || []; - $.each( dataAttributes, function( key, value ) { - switch ( key ) { - case 'class': - case 'classes': - case 'className': - $entity.addClass( value ); - break; - - // allow custom icons - case 'data-icon': - $entity.find( '.icon-item' ).removeClass().addClass( 'icon-item ' + value ); - $entity.attr( key, value ); - break; - - // ARIA support - case 'id': - $entity.attr( key, value ); - $entity.attr( 'aria-labelledby', value + '-label' ); - $entity.find( '.tree-branch-name > .tree-label' ).attr( 'id', value + '-label' ); - break; - - // id, style, data-* - default: - $entity.attr( key, value ); - break; - } - } ); - - // add child nodes - if ( $el.hasClass( 'tree-branch-header' ) ) { - $parent.find( '.tree-branch-children:eq(0)' ).append( $entity ); - } else { - $el.append( $entity ); - } - } ); - - // return newly populated folder - self.$element.trigger( 'loaded.fu.tree', $parent ); - } ); - }, - - selectItem: function( el ) { - var $el = $( el ); - var $all = this.$element.find( '.tree-selected' ); - var data = []; - var $icon = $el.find( '.icon-item' ); - - if ( this.options.multiSelect ) { - $.each( $all, function( index, value ) { - var $val = $( value ); - if ( $val[ 0 ] !== $el[ 0 ] ) { - data.push( $( value ).data() ); - } - } ); - } else if ( $all[ 0 ] !== $el[ 0 ] ) { - $all.removeClass( 'tree-selected' ) - .find( '.glyphicon' ).removeClass( 'glyphicon-ok' ).addClass( 'fueluxicon-bullet' ); - data.push( $el.data() ); - } - - var eventType = 'selected'; - if ( $el.hasClass( 'tree-selected' ) ) { - eventType = 'unselected'; - $el.removeClass( 'tree-selected' ); - if ( $icon.hasClass( 'glyphicon-ok' ) || $icon.hasClass( 'fueluxicon-bullet' ) ) { - $icon.removeClass( 'glyphicon-ok' ).addClass( 'fueluxicon-bullet' ); - } - } else { - $el.addClass( 'tree-selected' ); - // add tree dot back in - if ( $icon.hasClass( 'glyphicon-ok' ) || $icon.hasClass( 'fueluxicon-bullet' ) ) { - $icon.removeClass( 'fueluxicon-bullet' ).addClass( 'glyphicon-ok' ); - } - if ( this.options.multiSelect ) { - data.push( $el.data() ); - } - } - - if ( data.length ) { - this.$element.trigger( 'selected', { - selected: data - } ); - } - - // Return new list of selected items, the item - // clicked, and the type of event: - $el.trigger( 'updated.fu.tree', { - selected: data, - item: $el, - eventType: eventType - } ); - }, - - openFolder: function( el ) { - var $el = $( el ); // tree-branch-name - var $branch; - var $treeFolderContent; - var $treeFolderContentFirstChild; - - // if item select only - if ( !this.options.folderSelect ) { - $el = $( el ).parent(); // tree-branch, if tree-branch-name clicked - } - - $branch = $el.closest( '.tree-branch' ); // tree branch - $treeFolderContent = $branch.find( '.tree-branch-children' ); - $treeFolderContentFirstChild = $treeFolderContent.eq( 0 ); - - // manipulate branch/folder - var eventType, classToTarget, classToAdd; - if ( $el.find( '.glyphicon-folder-close' ).length ) { - eventType = 'opened'; - classToTarget = '.glyphicon-folder-close'; - classToAdd = 'glyphicon-folder-open'; - - $branch.addClass( 'tree-open' ); - $branch.attr( 'aria-expanded', 'true' ); - - $treeFolderContentFirstChild.removeClass( 'hide' ); - if ( !$treeFolderContent.children().length ) { - this.populate( $treeFolderContent ); - } - - } else if ( $el.find( '.glyphicon-folder-open' ) ) { - eventType = 'closed'; - classToTarget = '.glyphicon-folder-open'; - classToAdd = 'glyphicon-folder-close'; - - $branch.removeClass( 'tree-open' ); - $branch.attr( 'aria-expanded', 'false' ); - $treeFolderContentFirstChild.addClass( 'hide' ); - - // remove if no cache - if ( !this.options.cacheItems ) { - $treeFolderContentFirstChild.empty(); - } - - } - - $branch.find( '> .tree-branch-header .icon-folder' ).eq( 0 ) - .removeClass( 'glyphicon-folder-close glyphicon-folder-open' ) - .addClass( classToAdd ); - - this.$element.trigger( eventType, $branch.data() ); - }, - - selectFolder: function( clickedElement ) { - var $clickedElement = $( clickedElement ); - var $clickedBranch = $clickedElement.closest( '.tree-branch' ); - var $selectedBranch = this.$element.find( '.tree-branch.tree-selected' ); - var selectedData = []; - var eventType = 'selected'; - - // select clicked item - if ( $clickedBranch.hasClass( 'tree-selected' ) ) { - eventType = 'unselected'; - $clickedBranch.removeClass( 'tree-selected' ); - } else { - $clickedBranch.addClass( 'tree-selected' ); - } - - if ( this.options.multiSelect ) { - - // get currently selected - $selectedBranch = this.$element.find( '.tree-branch.tree-selected' ); - - $.each( $selectedBranch, function( index, value ) { - var $value = $( value ); - if ( $value[ 0 ] !== $clickedElement[ 0 ] ) { - selectedData.push( $( value ).data() ); - } - } ); - - } else if ( $selectedBranch[ 0 ] !== $clickedElement[ 0 ] ) { - $selectedBranch.removeClass( 'tree-selected' ); - - selectedData.push( $clickedBranch.data() ); - } - - if ( selectedData.length ) { - this.$element.trigger( 'selected.fu.tree', { - selected: selectedData - } ); - } - - // Return new list of selected items, the item - // clicked, and the type of event: - $clickedElement.trigger( 'updated.fu.tree', { - selected: selectedData, - item: $clickedElement, - eventType: eventType - } ); - }, - - selectedItems: function() { - var $sel = this.$element.find( '.tree-selected' ); - var data = []; - - $.each( $sel, function( index, value ) { - data.push( $( value ).data() ); - } ); - return data; - }, - - // collapses open folders - collapse: function() { - var cacheItems = this.options.cacheItems; - - // find open folders - this.$element.find( '.icon-folder-open' ).each( function() { - // update icon class - var $this = $( this ) - .removeClass( 'icon-folder-close icon-folder-open' ) - .addClass( 'icon-folder-close' ); - - // "close" or empty folder contents - var $parent = $this.parent().parent(); - var $folder = $parent.children( '.tree-branch-children' ); - - $folder.addClass( 'hide' ); - if ( !cacheItems ) { - $folder.empty(); - } - } ); - } - }; - - - // TREE PLUGIN DEFINITION - - $.fn.tree = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.tree' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.tree', ( data = new Tree( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.tree.defaults = { - dataSource: function( options, callback ) {}, - multiSelect: false, - cacheItems: true, - folderSelect: true - }; - - $.fn.tree.Constructor = Tree; - - $.fn.tree.noConflict = function() { - $.fn.tree = old; - return this; - }; - - - // NO DATA-API DUE TO NEED OF DATA-SOURCE - - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Wizard - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.wizard; - - // WIZARD CONSTRUCTOR AND PROTOTYPE - - var Wizard = function( element, options ) { - var kids; - - this.$element = $( element ); - this.options = $.extend( {}, $.fn.wizard.defaults, options ); - this.options.disablePreviousStep = ( this.$element.attr( 'data-restrict' ) === "previous" ) ? true : this.options.disablePreviousStep; - this.currentStep = this.options.selectedItem.step; - this.numSteps = this.$element.find( '.steps li' ).length; - this.$prevBtn = this.$element.find( 'button.btn-prev' ); - this.$nextBtn = this.$element.find( 'button.btn-next' ); - - kids = this.$nextBtn.children().detach(); - this.nextText = $.trim( this.$nextBtn.text() ); - this.$nextBtn.append( kids ); - - // handle events - this.$prevBtn.on( 'click.fu.wizard', $.proxy( this.previous, this ) ); - this.$nextBtn.on( 'click.fu.wizard', $.proxy( this.next, this ) ); - this.$element.on( 'click.fu.wizard', 'li.complete', $.proxy( this.stepclicked, this ) ); - - this.selectedItem( this.options.selectedItem ); - - if ( this.options.disablePreviousStep ) { - this.$prevBtn.attr( 'disabled', true ); - this.$element.find( '.steps' ).addClass( 'previous-disabled' ); - } - }; - - Wizard.prototype = { - - constructor: Wizard, - - destroy: function() { - this.$element.remove(); - // any external bindings [none] - // empty elements to return to original markup [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - //index is 1 based - //second parameter can be array of objects [{ ... }, { ... }] or you can pass n additional objects as args - //object structure is as follows (all params are optional): { badge: '', label: '', pane: '' } - addSteps: function( index ) { - var items = [].slice.call( arguments ).slice( 1 ); - var $steps = this.$element.find( '.steps' ); - var $stepContent = this.$element.find( '.step-content' ); - var i, l, $pane, $startPane, $startStep, $step; - - index = ( index === -1 || ( index > ( this.numSteps + 1 ) ) ) ? this.numSteps + 1 : index; - if ( items[ 0 ] instanceof Array ) { - items = items[ 0 ]; - } - - $startStep = $steps.find( 'li:nth-child(' + index + ')' ); - $startPane = $stepContent.find( '.step-pane:nth-child(' + index + ')' ); - if ( $startStep.length < 1 ) { - $startStep = null; - } - - for ( i = 0, l = items.length; i < l; i++ ) { - $step = $( '<li data-step="' + index + '"><span class="badge badge-info"></span></li>' ); - $step.append( items[ i ].label || '' ).append( '<span class="chevron"></span>' ); - $step.find( '.badge' ).append( items[ i ].badge || index ); - - $pane = $( '<div class="step-pane" data-step="' + index + '"></div>' ); - $pane.append( items[ i ].pane || '' ); - - if ( !$startStep ) { - $steps.append( $step ); - $stepContent.append( $pane ); - } else { - $startStep.before( $step ); - $startPane.before( $pane ); - } - index++; - } - - this.syncSteps(); - this.numSteps = $steps.find( 'li' ).length; - this.setState(); - }, - - //index is 1 based, howMany is number to remove - removeSteps: function( index, howMany ) { - var action = 'nextAll'; - var i = 0; - var $steps = this.$element.find( '.steps' ); - var $stepContent = this.$element.find( '.step-content' ); - var $start; - - howMany = ( howMany !== undefined ) ? howMany : 1; - - if ( index > $steps.find( 'li' ).length ) { - $start = $steps.find( 'li:last' ); - } else { - $start = $steps.find( 'li:nth-child(' + index + ')' ).prev(); - if ( $start.length < 1 ) { - action = 'children'; - $start = $steps; - } - } - - $start[ action ]().each( function() { - var item = $( this ); - var step = item.attr( 'data-step' ); - if ( i < howMany ) { - item.remove(); - $stepContent.find( '.step-pane[data-step="' + step + '"]:first' ).remove(); - } else { - return false; - } - i++; - } ); - - this.syncSteps(); - this.numSteps = $steps.find( 'li' ).length; - this.setState(); - }, - - setState: function() { - var canMovePrev = ( this.currentStep > 1 ); - var firstStep = ( this.currentStep === 1 ); - var lastStep = ( this.currentStep === this.numSteps ); - - // disable buttons based on current step - if ( !this.options.disablePreviousStep ) { - this.$prevBtn.attr( 'disabled', ( firstStep === true || canMovePrev === false ) ); - } - - // change button text of last step, if specified - var last = this.$nextBtn.attr( 'data-last' ); - if ( last ) { - this.lastText = last; - // replace text - var text = this.nextText; - if ( lastStep === true ) { - text = this.lastText; - // add status class to wizard - this.$element.addClass( 'complete' ); - } else { - this.$element.removeClass( 'complete' ); - } - var kids = this.$nextBtn.children().detach(); - this.$nextBtn.text( text ).append( kids ); - } - - // reset classes for all steps - var $steps = this.$element.find( '.steps li' ); - $steps.removeClass( 'active' ).removeClass( 'complete' ); - $steps.find( 'span.badge' ).removeClass( 'badge-info' ).removeClass( 'badge-success' ); - - // set class for all previous steps - var prevSelector = '.steps li:lt(' + ( this.currentStep - 1 ) + ')'; - var $prevSteps = this.$element.find( prevSelector ); - $prevSteps.addClass( 'complete' ); - $prevSteps.find( 'span.badge' ).addClass( 'badge-success' ); - - // set class for current step - var currentSelector = '.steps li:eq(' + ( this.currentStep - 1 ) + ')'; - var $currentStep = this.$element.find( currentSelector ); - $currentStep.addClass( 'active' ); - $currentStep.find( 'span.badge' ).addClass( 'badge-info' ); - - // set display of target element - var $stepContent = this.$element.find( '.step-content' ); - var target = $currentStep.attr( 'data-step' ); - $stepContent.find( '.step-pane' ).removeClass( 'active' ); - $stepContent.find( '.step-pane[data-step="' + target + '"]:first' ).addClass( 'active' ); - - // reset the wizard position to the left - this.$element.find( '.steps' ).first().attr( 'style', 'margin-left: 0' ); - - // check if the steps are wider than the container div - var totalWidth = 0; - this.$element.find( '.steps > li' ).each( function() { - totalWidth += $( this ).outerWidth(); - } ); - var containerWidth = 0; - if ( this.$element.find( '.actions' ).length ) { - containerWidth = this.$element.width() - this.$element.find( '.actions' ).first().outerWidth(); - } else { - containerWidth = this.$element.width(); - } - if ( totalWidth > containerWidth ) { - - // set the position so that the last step is on the right - var newMargin = totalWidth - containerWidth; - this.$element.find( '.steps' ).first().attr( 'style', 'margin-left: -' + newMargin + 'px' ); - - // set the position so that the active step is in a good - // position if it has been moved out of view - if ( this.$element.find( 'li.active' ).first().position().left < 200 ) { - newMargin += this.$element.find( 'li.active' ).first().position().left - 200; - if ( newMargin < 1 ) { - this.$element.find( '.steps' ).first().attr( 'style', 'margin-left: 0' ); - } else { - this.$element.find( '.steps' ).first().attr( 'style', 'margin-left: -' + newMargin + 'px' ); - } - } - } - - // only fire changed event after initializing - if ( typeof( this.initialized ) !== 'undefined' ) { - var e = $.Event( 'changed.fu.wizard' ); - this.$element.trigger( e, { - step: this.currentStep - } ); - } - - this.initialized = true; - }, - - stepclicked: function( e ) { - var li = $( e.currentTarget ); - var index = this.$element.find( '.steps li' ).index( li ); - var canMovePrev = true; - - if ( this.options.disablePreviousStep ) { - if ( index < this.currentStep ) { - canMovePrev = false; - } - } - - if ( canMovePrev ) { - var evt = $.Event( 'stepclicked.fu.wizard' ); - this.$element.trigger( evt, { - step: index + 1 - } ); - if ( evt.isDefaultPrevented() ) { - return; - } - - this.currentStep = ( index + 1 ); - this.setState(); - } - }, - - syncSteps: function() { - var i = 1; - var $steps = this.$element.find( '.steps' ); - var $stepContent = this.$element.find( '.step-content' ); - - $steps.children().each( function() { - var item = $( this ); - var badge = item.find( '.badge' ); - var step = item.attr( 'data-step' ); - - if ( !isNaN( parseInt( badge.html(), 10 ) ) ) { - badge.html( i ); - } - item.attr( 'data-step', i ); - $stepContent.find( '.step-pane[data-step="' + step + '"]:last' ).attr( 'data-step', i ); - i++; - } ); - }, - - previous: function() { - var canMovePrev = ( this.currentStep > 1 ); - if ( this.options.disablePreviousStep ) { - canMovePrev = false; - } - if ( canMovePrev ) { - var e = $.Event( 'actionclicked.fu.wizard' ); - this.$element.trigger( e, { - step: this.currentStep, - direction: 'previous' - } ); - if ( e.isDefaultPrevented() ) { - return; - } // don't increment - - this.currentStep -= 1; - this.setState(); - } - - // return focus to control after selecting an option - if ( this.$prevBtn.is( ':disabled' ) ) { - this.$nextBtn.focus(); - } else { - this.$prevBtn.focus(); - } - - }, - - next: function() { - var canMoveNext = ( this.currentStep + 1 <= this.numSteps ); - var lastStep = ( this.currentStep === this.numSteps ); - - if ( canMoveNext ) { - var e = $.Event( 'actionclicked.fu.wizard' ); - this.$element.trigger( e, { - step: this.currentStep, - direction: 'next' - } ); - if ( e.isDefaultPrevented() ) { - return; - } // don't increment - - this.currentStep += 1; - this.setState(); - } else if ( lastStep ) { - this.$element.trigger( 'finished.fu.wizard' ); - } - - // return focus to control after selecting an option - if ( this.$nextBtn.is( ':disabled' ) ) { - this.$prevBtn.focus(); - } else { - this.$nextBtn.focus(); - } - }, - - selectedItem: function( selectedItem ) { - var retVal, step; - - if ( selectedItem ) { - - step = selectedItem.step || -1; - - if ( step >= 1 && step <= this.numSteps ) { - this.currentStep = step; - this.setState(); - } else { - step = this.$element.find( '.steps li.active:first' ).attr( 'data-step' ); - if ( !isNaN( step ) ) { - this.currentStep = parseInt( step, 10 ); - this.setState(); - } - } - - retVal = this; - } else { - retVal = { - step: this.currentStep - }; - } - - return retVal; - } - }; - - - // WIZARD PLUGIN DEFINITION - - $.fn.wizard = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.wizard' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.wizard', ( data = new Wizard( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.wizard.defaults = { - disablePreviousStep: false, - selectedItem: { - step: -1 - } //-1 means it will attempt to look for "active" class in order to set the step - }; - - $.fn.wizard.Constructor = Wizard; - - $.fn.wizard.noConflict = function() { - $.fn.wizard = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mouseover.fu.wizard.data-api', '[data-initialize=wizard]', function( e ) { - var $control = $( e.target ).closest( '.wizard' ); - if ( !$control.data( 'fu.wizard' ) ) { - $control.wizard( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=wizard]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'fu.wizard' ) ) return; - $this.wizard( $this.data() ); - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Infinite Scroll - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.infinitescroll; - - // INFINITE SCROLL CONSTRUCTOR AND PROTOTYPE - - var InfiniteScroll = function( element, options ) { - this.$element = $( element ); - this.$element.addClass( 'infinitescroll' ); - this.options = $.extend( {}, $.fn.infinitescroll.defaults, options ); - - this.curScrollTop = this.$element.scrollTop(); - this.curPercentage = this.getPercentage(); - this.fetchingData = false; - - this.$element.on( 'scroll.fu.infinitescroll', $.proxy( this.onScroll, this ) ); - this.onScroll(); - }; - - InfiniteScroll.prototype = { - - constructor: InfiniteScroll, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - - // empty elements to return to original markup - this.$element.empty(); - - return this.$element[ 0 ].outerHTML; - }, - - disable: function() { - this.$element.off( 'scroll.fu.infinitescroll' ); - }, - - enable: function() { - this.$element.on( 'scroll.fu.infinitescroll', $.proxy( this.onScroll, this ) ); - }, - - end: function( content ) { - var end = $( '<div class="infinitescroll-end"></div>' ); - if ( content ) { - end.append( content ); - } else { - end.append( '---------' ); - } - this.$element.append( end ); - this.disable(); - }, - - getPercentage: function() { - var height = ( this.$element.css( 'box-sizing' ) === 'border-box' ) ? this.$element.outerHeight() : this.$element.height(); - var scrollHeight = this.$element.get( 0 ).scrollHeight; - return ( scrollHeight > height ) ? ( ( height / ( scrollHeight - this.curScrollTop ) ) * 100 ) : 0; - }, - - fetchData: function( force ) { - var load = $( '<div class="infinitescroll-load"></div>' ); - var self = this; - var moreBtn; - - var fetch = function() { - var helpers = { - percentage: self.curPercentage, - scrollTop: self.curScrollTop - }; - var $loader = $( '<div class="loader"></div>' ); - load.append( $loader ); - $loader.loader(); - if ( self.options.dataSource ) { - self.options.dataSource( helpers, function( resp ) { - var end; - load.remove(); - if ( resp.content ) { - self.$element.append( resp.content ); - } - if ( resp.end ) { - end = ( resp.end !== true ) ? resp.end : undefined; - self.end( end ); - } - self.fetchingData = false; - } ); - } - }; - - this.fetchingData = true; - this.$element.append( load ); - if ( this.options.hybrid && force !== true ) { - moreBtn = $( '<button type="button" class="btn btn-primary"></button>' ); - if ( typeof this.options.hybrid === 'object' ) { - moreBtn.append( this.options.hybrid.label ); - } else { - moreBtn.append( '<span class="glyphicon glyphicon-repeat"></span>' ); - } - moreBtn.on( 'click.fu.infinitescroll', function() { - moreBtn.remove(); - fetch(); - } ); - load.append( moreBtn ); - } else { - fetch(); - } - }, - - onScroll: function( e ) { - this.curScrollTop = this.$element.scrollTop(); - this.curPercentage = this.getPercentage(); - if ( !this.fetchingData && this.curPercentage >= this.options.percentage ) { - this.fetchData(); - } - } - - }; - - // INFINITE SCROLL PLUGIN DEFINITION - - $.fn.infinitescroll = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.infinitescroll' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.infinitescroll', ( data = new InfiniteScroll( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.infinitescroll.defaults = { - dataSource: null, - hybrid: false, //can be true or an object with structure: { 'label': (markup or jQuery obj) } - percentage: 95 //percentage scrolled to the bottom before more is loaded - }; - - $.fn.infinitescroll.Constructor = InfiniteScroll; - - $.fn.infinitescroll.noConflict = function() { - $.fn.infinitescroll = old; - return this; - }; - - // NO DATA-API DUE TO NEED OF DATA-SOURCE - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Pillbox - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.pillbox; - - // PILLBOX CONSTRUCTOR AND PROTOTYPE - - var Pillbox = function( element, options ) { - this.$element = $( element ); - this.$moreCount = this.$element.find( '.pillbox-more-count' ); - this.$pillGroup = this.$element.find( '.pill-group' ); - this.$addItem = this.$element.find( '.pillbox-add-item' ); - this.$addItemWrap = this.$addItem.parent(); - this.$suggest = this.$element.find( '.suggest' ); - this.$pillHTML = '<li class="btn btn-default pill">' + - ' <span></span>' + - ' <span class="glyphicon glyphicon-close">' + - ' <span class="sr-only">Remove</span>' + - ' </span>' + - '</li>'; - - this.options = $.extend( {}, $.fn.pillbox.defaults, options ); - - if ( this.options.readonly === -1 ) { - if ( this.$element.attr( 'data-readonly' ) !== undefined ) { - this.readonly( true ); - } - } else if ( this.options.readonly ) { - this.readonly( true ); - } - - // EVENTS - this.acceptKeyCodes = this._generateObject( this.options.acceptKeyCodes ); - // Creatie an object out of the key code array, so we dont have to loop through it on every key stroke - - this.$element.on( 'click.fu.pillbox', '.pill-group > .pill', $.proxy( this.itemClicked, this ) ); - this.$element.on( 'click.fu.pillbox', $.proxy( this.inputFocus, this ) ); - this.$element.on( 'keydown.fu.pillbox', '.pillbox-add-item', $.proxy( this.inputEvent, this ) ); - if ( this.options.onKeyDown ) { - this.$element.on( 'mousedown.fu.pillbox', '.suggest > li', $.proxy( this.suggestionClick, this ) ); - } - if ( this.options.edit ) { - this.$element.addClass( 'pills-editable' ); - this.$element.on( 'blur.fu.pillbox', '.pillbox-add-item', $.proxy( this.cancelEdit, this ) ); - } - }; - - Pillbox.prototype = { - constructor: Pillbox, - - destroy: function() { - this.$element.remove(); - // any external bindings - // [none] - // empty elements to return to original markup - // [none] - // returns string of markup - return this.$element[ 0 ].outerHTML; - }, - - items: function() { - var self = this; - - return this.$pillGroup.children( '.pill' ).map( function() { - return self.getItemData( $( this ) ); - } ).get(); - }, - - itemClicked: function( e ) { - var self = this; - var $target = $( e.target ); - var $item; - - e.preventDefault(); - e.stopPropagation(); - this._closeSuggestions(); - - if ( !$target.hasClass( 'pill' ) ) { - $item = $target.parent(); - if ( this.$element.attr( 'data-readonly' ) === undefined ) { - if ( $target.hasClass( 'glyphicon-close' ) ) { - if ( this.options.onRemove ) { - this.options.onRemove( this.getItemData( $item, { - el: $item - } ), $.proxy( this._removeElement, this ) ); - } else { - this._removeElement( this.getItemData( $item, { - el: $item - } ) ); - } - return false; - } else if ( this.options.edit ) { - if ( $item.find( '.pillbox-list-edit' ).length ) { - return false; - } - this.openEdit( $item ); - } - } - } else { - $item = $target; - } - - this.$element.trigger( 'clicked.fu.pillbox', this.getItemData( $item ) ); - }, - - readonly: function( enable ) { - if ( enable ) { - this.$element.attr( 'data-readonly', 'readonly' ); - } else { - this.$element.removeAttr( 'data-readonly' ); - } - if ( this.options.truncate ) { - this.truncate( enable ); - } - }, - - suggestionClick: function( e ) { - var $item = $( e.currentTarget ); - - e.preventDefault(); - this.$addItem.val( '' ); - - this.addItems( { - text: $item.html(), - value: $item.data( 'value' ) - }, true ); - - // needs to be after addItems for IE - this._closeSuggestions(); - }, - - itemCount: function() { - return this.$pillGroup.children( '.pill' ).length; - }, - - // First parameter is 1 based index (optional, if index is not passed all new items will be appended) - // Second parameter can be array of objects [{ ... }, { ... }] or you can pass n additional objects as args - // object structure is as follows (index and value are optional): { text: '', value: '' } - addItems: function() { - var self = this; - var items, index, isInternal; - - if ( isFinite( String( arguments[ 0 ] ) ) && !( arguments[ 0 ] instanceof Array ) ) { - items = [].slice.call( arguments ).slice( 1 ); - index = arguments[ 0 ]; - } else { - items = [].slice.call( arguments ).slice( 0 ); - isInternal = items[ 1 ] && !items[ 1 ].text; - } - - //Accounting for array parameter - if ( items[ 0 ] instanceof Array ) { - items = items[ 0 ]; - } - - if ( items.length ) { - $.each( items, function( i, value ) { - var data = { - text: value.text, - value: ( value.value ? value.value : value.text ), - el: self.$pillHTML - }; - - items[ i ] = data; - } ); - - if ( this.options.edit && this.currentEdit ) { - items[ 0 ].el = this.currentEdit.wrap( '<div></div>' ).parent().html(); - } - - if ( isInternal ) { - items.pop( 1 ); - } - - if ( self.options.onAdd && isInternal ) { - - if ( this.options.edit && this.currentEdit ) { - self.options.onAdd( items[ 0 ], $.proxy( self.saveEdit, this ) ); - } else { - self.options.onAdd( items[ 0 ], $.proxy( self.placeItems, this, true ) ); - } - } else { - if ( this.options.edit && this.currentEdit ) { - self.saveEdit( items ); - } else { - if ( index ) { - self.placeItems( index, items ); - } else { - self.placeItems( items, isInternal ); - } - } - } - } - - }, - - //First parameter is the index (1 based) to start removing items - //Second parameter is the number of items to be removed - removeItems: function( index, howMany ) { - var self = this; - var count; - var $currentItem; - - if ( !index ) { - this.$pillGroup.find( '.pill' ).remove(); - this._removePillTrigger( { - method: 'removeAll' - } ); - } else { - howMany = howMany ? howMany : 1; - - for ( count = 0; count < howMany; count++ ) { - $currentItem = self.$pillGroup.find( '> .pill:nth-child(' + index + ')' ); - - if ( $currentItem ) { - $currentItem.remove(); - } else { - break; - } - } - } - }, - - //First parameter is index (optional) - //Second parameter is new arguments - placeItems: function() { - var newHtml = ''; - var items; - var index; - var $neighbor; - var isInternal; - - if ( isFinite( String( arguments[ 0 ] ) ) && !( arguments[ 0 ] instanceof Array ) ) { - items = [].slice.call( arguments ).slice( 1 ); - index = arguments[ 0 ]; - } else { - items = [].slice.call( arguments ).slice( 0 ); - isInternal = items[ 1 ] && !items[ 1 ].text; - } - - if ( items[ 0 ] instanceof Array ) { - items = items[ 0 ]; - } - - if ( items.length ) { - $.each( items, function( i, item ) { - var $item = $( item.el ); - var $neighbor; - - $item.attr( 'data-value', item.value ); - $item.find( 'span:first' ).html( item.text ); - - newHtml += $item.wrap( '<div></div>' ).parent().html(); - } ); - - if ( this.$pillGroup.children( '.pill' ).length > 0 ) { - if ( index ) { - $neighbor = this.$pillGroup.find( '.pill:nth-child(' + index + ')' ); - - if ( $neighbor.length ) { - $neighbor.before( newHtml ); - } else { - this.$pillGroup.children( '.pill:last' ).after( newHtml ); - } - } else { - this.$pillGroup.children( '.pill:last' ).after( newHtml ); - } - } else { - this.$pillGroup.prepend( newHtml ); - } - - if ( isInternal ) { - this.$element.trigger( 'added.fu.pillbox', { - text: items[ 0 ].text, - value: items[ 0 ].value - } ); - } - } - }, - - inputEvent: function( e ) { - var self = this; - var text = this.$addItem.val(); - var value; - var $lastItem; - var $selection; - - if ( this.acceptKeyCodes[ e.keyCode ] ) { - - if ( this.options.onKeyDown && this._isSuggestionsOpen() ) { - $selection = this.$suggest.find( '.pillbox-suggest-sel' ); - - if ( $selection.length ) { - text = $selection.html(); - value = $selection.data( 'value' ); - } - } - - if ( text.length ) { - this._closeSuggestions(); - this.$addItem.hide(); - - this.addItems( { - text: text, - value: value - }, true ); - - setTimeout( function() { - self.$addItem.show().val( '' ).attr( { - size: 10 - } ); - }, 0 ); - } - - e.preventDefault(); - return true; - } else if ( e.keyCode === 8 || e.keyCode === 46 ) { - // backspace: 8 - // delete: 46 - - if ( !text.length ) { - e.preventDefault(); - - if ( this.options.edit && this.currentEdit ) { - this.cancelEdit(); - return true; - } - - this._closeSuggestions(); - $lastItem = this.$pillGroup.children( '.pill:last' ); - - if ( $lastItem.hasClass( 'pillbox-highlight' ) ) { - this._removeElement( this.getItemData( $lastItem, { - el: $lastItem - } ) ); - } else { - $lastItem.addClass( 'pillbox-highlight' ); - } - - return true; - } - } else if ( text.length > 10 ) { - if ( this.$addItem.width() < ( this.$pillGroup.width() - 6 ) ) { - this.$addItem.attr( { - size: text.length + 3 - } ); - } - } - - this.$pillGroup.find( '.pill' ).removeClass( 'pillbox-highlight' ); - - if ( this.options.onKeyDown ) { - if ( e.keyCode === 9 || e.keyCode === 38 || e.keyCode === 40 ) { - // tab: 9 - // up arrow: 38 - // down arrow: 40 - - if ( this._isSuggestionsOpen() ) { - this._keySuggestions( e ); - } - return true; - } - - //only allowing most recent event callback to register - this.callbackId = e.timeStamp; - this.options.onKeyDown( { - event: e, - value: text - }, function( data ) { - self._openSuggestions( e, data ); - } ); - } - }, - - openEdit: function( el ) { - var index = el.index() + 1; - var $addItemWrap = this.$addItemWrap.detach().hide(); - - this.$pillGroup.find( '.pill:nth-child(' + index + ')' ).before( $addItemWrap ); - this.currentEdit = el.detach(); - - $addItemWrap.addClass( 'editing' ); - this.$addItem.val( el.find( 'span:first' ).html() ); - $addItemWrap.show(); - this.$addItem.focus().select(); - }, - - cancelEdit: function( e ) { - var $addItemWrap; - if ( !this.currentEdit ) { - return false; - } - - this._closeSuggestions(); - if ( e ) { - this.$addItemWrap.before( this.currentEdit ); - } - this.currentEdit = false; - - $addItemWrap = this.$addItemWrap.detach(); - $addItemWrap.removeClass( 'editing' ); - this.$addItem.val( '' ); - this.$pillGroup.append( $addItemWrap ); - }, - - //Must match syntax of placeItem so addItem callback is called when an item is edited - //expecting to receive an array back from the callback containing edited items - saveEdit: function() { - var item = arguments[ 0 ][ 0 ]; - - this.currentEdit = $( item.el ); - this.currentEdit.data( 'value', item.value ); - this.currentEdit.find( 'span:first' ).html( item.text ); - - this.$addItemWrap.hide(); - this.$addItemWrap.before( this.currentEdit ); - this.currentEdit = false; - - this.$addItem.val( '' ); - this.$addItemWrap.removeClass( 'editing' ); - this.$pillGroup.append( this.$addItemWrap.detach().show() ); - this.$element.trigger( 'edited.fu.pillbox', { - value: item.value, - text: item.text - } ); - }, - - removeBySelector: function() { - var selectors = [].slice.call( arguments ).slice( 0 ); - var self = this; - - $.each( selectors, function( i, sel ) { - self.$pillGroup.find( sel ).remove(); - } ); - - this._removePillTrigger( { - method: 'removeBySelector', - removedSelectors: selectors - } ); - }, - - removeByValue: function() { - var values = [].slice.call( arguments ).slice( 0 ); - var self = this; - - $.each( values, function( i, val ) { - self.$pillGroup.find( '> .pill[data-value="' + val + '"]' ).remove(); - } ); - - this._removePillTrigger( { - method: 'removeByValue', - removedValues: values - } ); - }, - - removeByText: function() { - var text = [].slice.call( arguments ).slice( 0 ); - var self = this; - - $.each( text, function( i, text ) { - self.$pillGroup.find( '> .pill:contains("' + text + '")' ).remove(); - } ); - - this._removePillTrigger( { - method: 'removeByText', - removedText: text - } ); - }, - - truncate: function( enable ) { - var self = this; - var available, full, i, pills, used; - - this.$element.removeClass( 'truncate' ); - this.$addItemWrap.removeClass( 'truncated' ); - this.$pillGroup.find( '.pill' ).removeClass( 'truncated' ); - - if ( enable ) { - this.$element.addClass( 'truncate' ); - - available = this.$element.width(); - full = false; - i = 0; - pills = this.$pillGroup.find( '.pill' ).length; - used = 0; - - this.$pillGroup.find( '.pill' ).each( function() { - var pill = $( this ); - if ( !full ) { - i++; - self.$moreCount.text( pills - i ); - if ( ( used + pill.outerWidth( true ) + self.$addItemWrap.outerWidth( true ) ) <= available ) { - used += pill.outerWidth( true ); - } else { - self.$moreCount.text( ( pills - i ) + 1 ); - pill.addClass( 'truncated' ); - full = true; - } - } else { - pill.addClass( 'truncated' ); - } - } ); - if ( i === pills ) { - this.$addItemWrap.addClass( 'truncated' ); - } - } - }, - - inputFocus: function( e ) { - this.$element.find( '.pillbox-add-item' ).focus(); - }, - - getItemData: function( el, data ) { - return $.extend( { - text: el.find( 'span:first' ).html() - }, el.data(), data ); - }, - - _removeElement: function( data ) { - data.el.remove(); - delete data.el; - this.$element.trigger( 'removed.fu.pillbox', data ); - }, - - _removePillTrigger: function( removedBy ) { - this.$element.trigger( 'removed.fu.pillbox', removedBy ); - }, - - _generateObject: function( data ) { - var obj = {}; - - $.each( data, function( index, value ) { - obj[ value ] = true; - } ); - - return obj; - }, - - _openSuggestions: function( e, data ) { - var markup = ''; - - if ( this.callbackId !== e.timeStamp ) { - return false; - } - - if ( data.data && data.data.length ) { - $.each( data.data, function( index, value ) { - var val = value.value ? value.value : value.text; - markup += '<li data-value="' + val + '">' + value.text + '</li>'; - } ); - - // suggestion dropdown - - this.$suggest.html( '' ).append( markup ); - $( document.body ).trigger( 'suggested.fu.pillbox', this.$suggest ); - } - }, - - _closeSuggestions: function() { - this.$suggest.html( '' ).parent().removeClass( 'open' ); - }, - - _isSuggestionsOpen: function() { - return this.$suggest.parent().hasClass( 'open' ); - }, - - _keySuggestions: function( e ) { - var $first = this.$suggest.find( 'li.pillbox-suggest-sel' ); - var dir = e.keyCode === 38; // up arrow - var $next, val; - - e.preventDefault(); - - if ( !$first.length ) { - $first = this.$suggest.find( 'li:first' ); - $first.addClass( 'pillbox-suggest-sel' ); - } else { - $next = dir ? $first.prev() : $first.next(); - - if ( !$next.length ) { - $next = dir ? this.$suggest.find( 'li:last' ) : this.$suggest.find( 'li:first' ); - } - - if ( $next ) { - $next.addClass( 'pillbox-suggest-sel' ); - $first.removeClass( 'pillbox-suggest-sel' ); - } - } - } - }; - - // PILLBOX PLUGIN DEFINITION - - $.fn.pillbox = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.pillbox' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.pillbox', ( data = new Pillbox( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.pillbox.defaults = { - onAdd: undefined, - onRemove: undefined, - onKeyDown: undefined, - edit: false, - readonly: -1, //can be true or false. -1 means it will check for data-readonly="readonly" - truncate: false, - acceptKeyCodes: [ - 13, //Enter - 188 //Comma - ] - - //example on remove - /*onRemove: function(data,callback){ - console.log('onRemove'); - callback(data); - }*/ - - //example on key down - /*onKeyDown: function(event, data, callback ){ - callback({data:[ - {text: Math.random(),value:'sdfsdfsdf'}, - {text: Math.random(),value:'sdfsdfsdf'} - ]}); - } - */ - //example onAdd - /*onAdd: function( data, callback ){ - console.log(data, callback); - callback(data); - }*/ - }; - - $.fn.pillbox.Constructor = Pillbox; - - $.fn.pillbox.noConflict = function() { - $.fn.pillbox = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mousedown.fu.pillbox.data-api', '[data-initialize=pillbox]', function( e ) { - var $control = $( e.target ).closest( '.pillbox' ); - if ( !$control.data( 'fu.pillbox' ) ) { - $control.pillbox( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=pillbox]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'fu.pillbox' ) ) return; - $this.pillbox( $this.data() ); - } ); - } ); - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Repeater - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.repeater; - - // REPEATER CONSTRUCTOR AND PROTOTYPE - - var Repeater = function( element, options ) { - var self = this; - var currentView; - - this.$element = $( element ); - - this.$canvas = this.$element.find( '.repeater-canvas' ); - this.$count = this.$element.find( '.repeater-count' ); - this.$end = this.$element.find( '.repeater-end' ); - this.$filters = this.$element.find( '.repeater-filters' ); - this.$loader = this.$element.find( '.repeater-loader' ); - this.$pageSize = this.$element.find( '.repeater-itemization .selectlist' ); - this.$nextBtn = this.$element.find( '.repeater-next' ); - this.$pages = this.$element.find( '.repeater-pages' ); - this.$prevBtn = this.$element.find( '.repeater-prev' ); - this.$primaryPaging = this.$element.find( '.repeater-primaryPaging' ); - this.$search = this.$element.find( '.repeater-search' ).find( '.search' ); - this.$secondaryPaging = this.$element.find( '.repeater-secondaryPaging' ); - this.$start = this.$element.find( '.repeater-start' ); - this.$viewport = this.$element.find( '.repeater-viewport' ); - this.$views = this.$element.find( '.repeater-views' ); - - this.eventStamp = new Date().getTime() + ( Math.floor( Math.random() * 100 ) + 1 ); - this.currentPage = 0; - this.currentView = null; - this.infiniteScrollingCallback = function() {}; - this.infiniteScrollingCont = null; - this.infiniteScrollingEnabled = false; - this.infiniteScrollingEnd = null; - this.infiniteScrollingOptions = {}; - this.lastPageInput = 0; - this.options = $.extend( {}, $.fn.repeater.defaults, options ); - this.pageIncrement = 0; // store direction navigated - this.resizeTimeout = {}; - this.staticHeight = ( this.options.staticHeight === -1 ) ? this.$element.attr( 'data-staticheight' ) : this.options.staticHeight; - - this.$filters.selectlist(); - this.$pageSize.selectlist(); - this.$primaryPaging.find( '.combobox' ).combobox(); - this.$search.search(); - - this.$filters.on( 'changed.fu.selectlist', $.proxy( this.render, this, { - clearInfinite: true, - pageIncrement: null - } ) ); - this.$nextBtn.on( 'click.fu.repeater', $.proxy( this.next, this ) ); - this.$pageSize.on( 'changed.fu.selectlist', $.proxy( this.render, this, { - pageIncrement: null - } ) ); - this.$prevBtn.on( 'click.fu.repeater', $.proxy( this.previous, this ) ); - this.$primaryPaging.find( '.combobox' ).on( 'changed.fu.combobox', function( evt, data ) { - self.pageInputChange( data.text ); - } ); - this.$search.on( 'searched.fu.search cleared.fu.search', $.proxy( this.render, this, { - clearInfinite: true, - pageIncrement: null - } ) ); - this.$secondaryPaging.on( 'blur.fu.repeater', function() { - self.pageInputChange( self.$secondaryPaging.val() ); - } ); - this.$secondaryPaging.on( 'change.fu.repeater', function() { - self.pageInputChange( self.$secondaryPaging.val() ); - } ); - this.$views.find( 'input' ).on( 'change.fu.repeater', $.proxy( this.viewChanged, this ) ); - - // ID needed since event is bound to instance - $( window ).on( 'resize.fu.repeater.' + this.eventStamp, function( event ) { - clearTimeout( self.resizeTimeout ); - self.resizeTimeout = setTimeout( function() { - self.resize(); - self.$element.trigger( 'resized.fu.repeater' ); - }, 75 ); - } ); - - this.$loader.loader(); - this.$loader.loader( 'pause' ); - currentView = ( this.options.defaultView !== -1 ) ? this.options.defaultView : this.$views.find( 'label.active input' ).val(); - - this.initViews( function() { - self.resize(); - self.$element.trigger( 'resized.fu.repeater' ); - self.render( { - changeView: currentView - } ); - } ); - }; - - Repeater.prototype = { - constructor: Repeater, - - clear: function( options ) { - var scan = function( cont ) { - var keep = []; - cont.children().each( function() { - var item = $( this ); - var pres = item.attr( 'data-preserve' ); - if ( pres === 'deep' ) { - item.detach(); - keep.push( item ); - } else if ( pres === 'shallow' ) { - scan( item ); - item.detach(); - keep.push( item ); - } - } ); - cont.empty(); - cont.append( keep ); - }; - - options = options || {}; - - if ( !options.preserve ) { - this.$canvas.empty(); - } else if ( !this.infiniteScrollingEnabled || options.clearInfinite ) { - scan( this.$canvas ); - } - }, - - destroy: function() { - var markup; - // set input value attrbute in markup - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - - // empty elements to return to original markup - this.$canvas.empty(); - markup = this.$element[ 0 ].outerHTML; - - // destroy components and remove leftover - this.$element.find( '.combobox' ).combobox( 'destroy' ); - this.$element.find( '.selectlist' ).selectlist( 'destroy' ); - this.$element.find( '.search' ).search( 'destroy' ); - if ( this.infiniteScrollingEnabled ) { - $( this.infiniteScrollingCont ).infinitescroll( 'destroy' ); - } - this.$element.remove(); - - // any external events - $( window ).off( 'resize.fu.repeater.' + this.eventStamp ); - - return markup; - }, - - getDataOptions: function( options, callback ) { - var opts = {}; - var val, viewDataOpts; - - options = options || {}; - - opts.filter = this.$filters.selectlist( 'selectedItem' ); - opts.view = this.currentView; - - if ( !this.infiniteScrollingEnabled ) { - opts.pageSize = parseInt( this.$pageSize.selectlist( 'selectedItem' ).value, 10 ); - } - if ( options.pageIncrement !== undefined ) { - if ( options.pageIncrement === null ) { - this.currentPage = 0; - } else { - this.currentPage += options.pageIncrement; - } - } - opts.pageIndex = this.currentPage; - - val = this.$search.find( 'input' ).val(); - if ( val !== '' ) { - opts.search = val; - } - - viewDataOpts = $.fn.repeater.views[ this.currentView ] || {}; - viewDataOpts = viewDataOpts.dataOptions; - if ( viewDataOpts ) { - viewDataOpts.call( this, opts, function( obj ) { - callback( obj ); - } ); - } else { - callback( opts ); - } - }, - - infiniteScrolling: function( enable, options ) { - var itemization = this.$element.find( '.repeater-itemization' ); - var pagination = this.$element.find( '.repeater-pagination' ); - var cont, data; - - options = options || {}; - - if ( enable ) { - this.infiniteScrollingEnabled = true; - this.infiniteScrollingEnd = options.end; - delete options.dataSource; - delete options.end; - this.infiniteScrollingOptions = options; - itemization.hide(); - pagination.hide(); - } else { - cont = this.infiniteScrollingCont; - data = cont.data(); - delete data.infinitescroll; - cont.off( 'scroll' ); - cont.removeClass( 'infinitescroll' ); - - this.infiniteScrollingCont = null; - this.infiniteScrollingEnabled = false; - this.infiniteScrollingEnd = null; - this.infiniteScrollingOptions = {}; - itemization.show(); - pagination.show(); - } - }, - - infiniteScrollPaging: function( data, options ) { - var end = ( this.infiniteScrollingEnd !== true ) ? this.infiniteScrollingEnd : undefined; - var page = data.page; - var pages = data.pages; - - this.currentPage = ( page !== undefined ) ? page : NaN; - - if ( ( this.currentPage + 1 ) >= pages ) { - this.infiniteScrollingCont.infinitescroll( 'end', end ); - } - }, - - initInfiniteScrolling: function() { - var cont = this.$canvas.find( '[data-infinite="true"]:first' ); - var opts, self; - - cont = ( cont.length < 1 ) ? this.$canvas : cont; - if ( cont.data( 'fu.infinitescroll' ) ) { - cont.infinitescroll( 'enable' ); - } else { - self = this; - opts = $.extend( {}, this.infiniteScrollingOptions ); - opts.dataSource = function( helpers, callback ) { - self.infiniteScrollingCallback = callback; - self.render( { - pageIncrement: 1 - } ); - }; - cont.infinitescroll( opts ); - this.infiniteScrollingCont = cont; - } - }, - - initViews: function( callback ) { - var views = []; - var i, viewsLength; - - var init = function( index ) { - var next = function() { - index++; - if ( index < viewsLength ) { - init( index ); - } else { - callback(); - } - }; - - if ( views[ index ].initialize ) { - views[ index ].initialize.call( this, {}, function() { - next(); - } ); - } else { - next(); - } - }; - - for ( i in $.fn.repeater.views ) { - views.push( $.fn.repeater.views[ i ] ); - } - viewsLength = views.length; - if ( viewsLength > 0 ) { - init( 0 ); - } else { - callback(); - } - }, - - itemization: function( data ) { - this.$count.html( data.count || '' ); - this.$end.html( data.end || '' ); - this.$start.html( data.start || '' ); - }, - - next: function() { - var d = 'disabled'; - this.$nextBtn.attr( d, d ); - this.$prevBtn.attr( d, d ); - this.pageIncrement = 1; - this.render( { - pageIncrement: this.pageIncrement - } ); - }, - - pageInputChange: function( val ) { - var pageInc; - if ( val !== this.lastPageInput ) { - this.lastPageInput = val; - val = parseInt( val, 10 ) - 1; - pageInc = val - this.currentPage; - this.render( { - pageIncrement: pageInc - } ); - } - }, - - pagination: function( data ) { - var act = 'active'; - var dsbl = 'disabled'; - var page = data.page; - var pages = data.pages; - var dropMenu, i, l; - - this.currentPage = ( page !== undefined ) ? page : NaN; - - this.$primaryPaging.removeClass( act ); - this.$secondaryPaging.removeClass( act ); - - if ( pages <= this.options.dropPagingCap ) { - this.$primaryPaging.addClass( act ); - dropMenu = this.$primaryPaging.find( '.dropdown-menu' ); - dropMenu.empty(); - for ( i = 0; i < pages; i++ ) { - l = i + 1; - dropMenu.append( '<li data-value="' + l + '"><a href="#">' + l + '</a></li>' ); - } - this.$primaryPaging.find( 'input.form-control' ).val( this.currentPage + 1 ); - } else { - this.$secondaryPaging.addClass( act ); - this.$secondaryPaging.val( this.currentPage + 1 ); - } - this.lastPageInput = this.currentPage + 1 + ''; - - this.$pages.html( pages ); - - // this is not the last page - if ( ( this.currentPage + 1 ) < pages ) { - this.$nextBtn.removeAttr( dsbl ); - } else { - this.$nextBtn.attr( dsbl, dsbl ); - } - // this is not the first page - if ( ( this.currentPage - 1 ) >= 0 ) { - this.$prevBtn.removeAttr( dsbl ); - } else { - this.$prevBtn.attr( dsbl, dsbl ); - } - - // return focus to next/previous buttons after navigating - if ( this.pageIncrement !== 0 ) { - if ( this.pageIncrement > 0 ) { - if ( this.$nextBtn.is( ':disabled' ) ) { - // if you can't focus, go the other way - this.$prevBtn.focus(); - } else { - this.$nextBtn.focus(); - } - } else { - if ( this.$prevBtn.is( ':disabled' ) ) { - // if you can't focus, go the other way - this.$nextBtn.focus(); - } else { - this.$prevBtn.focus(); - } - } - } - }, - - previous: function() { - var d = 'disabled'; - this.$nextBtn.attr( d, d ); - this.$prevBtn.attr( d, d ); - this.pageIncrement = -1; - this.render( { - pageIncrement: this.pageIncrement - } ); - }, - - render: function( options ) { - var self = this; - var viewChanged = false; - var viewObj = $.fn.repeater.views[ self.currentView ] || {}; - var prevView; - - var start = function() { - options.preserve = ( options.preserve !== undefined ) ? options.preserve : !viewChanged; - self.clear( options ); - if ( !self.infiniteScrollingEnabled || ( self.infiniteScrollingEnabled && viewChanged ) ) { - self.$loader.show().loader( 'play' ); - } - self.getDataOptions( options, function( opts ) { - self.options.dataSource( opts, function( data ) { - var renderer = viewObj.renderer; - if ( self.infiniteScrollingEnabled ) { - self.infiniteScrollingCallback( {} ); - } else { - self.itemization( data ); - self.pagination( data ); - } - if ( renderer ) { - self.runRenderer( self.$canvas, renderer, data, function() { - if ( self.infiniteScrollingEnabled ) { - if ( viewChanged || options.clearInfinite ) { - self.initInfiniteScrolling(); - } - self.infiniteScrollPaging( data, options ); - } - self.$loader.hide().loader( 'pause' ); - self.$element.trigger( 'loaded.fu.repeater' ); - } ); - } - } ); - } ); - }; - - options = options || {}; - - if ( options.changeView && this.currentView !== options.changeView ) { - prevView = this.currentView; - this.currentView = options.changeView; - this.$element.attr( 'data-currentview', this.currentView ); - viewChanged = true; - if ( this.infiniteScrollingEnabled ) { - self.infiniteScrolling( false ); - } - viewObj = $.fn.repeater.views[ self.currentView ] || {}; - if ( viewObj.selected ) { - viewObj.selected.call( this, { - prevView: prevView - }, function() { - start(); - } ); - } else { - start(); - } - } else { - start(); - } - }, - - resize: function() { - var staticHeight = this.staticHeight; - var viewObj = $.fn.repeater.views[ this.currentView ] || {}; - var height, viewportMargins; - - if ( staticHeight !== undefined ) { - this.$canvas.addClass( 'scrolling' ); - viewportMargins = { - bottom: this.$viewport.css( 'margin-bottom' ), - top: this.$viewport.css( 'margin-top' ) - }; - height = ( ( staticHeight === 'true' || staticHeight === true ) ? this.$element.height() : parseInt( staticHeight, 10 ) ) - - this.$element.find( '.repeater-header' ).outerHeight() - - this.$element.find( '.repeater-footer' ).outerHeight() - - ( ( viewportMargins.bottom === 'auto' ) ? 0 : parseInt( viewportMargins.bottom, 10 ) ) - - ( ( viewportMargins.top === 'auto' ) ? 0 : parseInt( viewportMargins.top, 10 ) ); - this.$viewport.outerHeight( height ); - } else { - this.$canvas.removeClass( 'scrolling' ); - } - - if ( viewObj.resize ) { - viewObj.resize.call( this, { - height: this.$element.outerHeight(), - width: this.$element.outerWidth() - }, function() {} ); - } - }, - - runRenderer: function( container, renderer, data, callback ) { - var self = this; - var skipNested = false; - var repeat, subset, i, l; - - var loopSubset = function( index ) { - var args = { - container: container, - data: data - }; - if ( renderer.repeat ) { - args.subset = subset; - args.index = index; - } - if ( subset.length < 1 ) { - callback(); - } else { - start( args, function() { - index++; - if ( index < subset.length ) { - loopSubset( index ); - } else { - callback(); - } - } ); - } - }; - - var start = function( args, cb ) { - var item = ''; - - var callbacks = { - before: function( resp ) { - if ( resp && resp.skipNested === true ) { - skipNested = true; - } - proceed( 'render', args ); - }, - render: function( resp ) { - var action = ( resp && resp.action ) ? resp.action : 'append'; - if ( resp && resp.item !== undefined ) { - item = $( resp.item ); - if ( item.length < 1 ) { - item = resp.item; - } - if ( action !== 'none' ) { - container[ action ]( item ); - } - args.item = item; - } - if ( resp && resp.skipNested === true ) { - skipNested = true; - } - proceed( 'after', args ); - }, - after: function( resp ) { - var cont; - var loopNested = function( cont, index ) { - self.runRenderer( cont, renderer.nested[ index ], data, function() { - index++; - if ( index < renderer.nested.length ) { - loopNested( cont, index ); - } else { - proceed( 'complete', args ); - } - } ); - }; - - if ( resp && resp.skipNested === true ) { - skipNested = true; - } - - if ( renderer.nested && !skipNested ) { - cont = $( item ); - cont = ( cont.attr( 'data-container' ) === 'true' ) ? cont : cont.find( '[data-container="true"]:first' ); - if ( cont.length < 1 ) { - cont = container; - } - loopNested( cont, 0 ); - } else { - callbacks.complete( null ); - } - }, - complete: function( resp ) { - if ( cb ) { - cb(); - } - } - }; - - var proceed = function( stage, argus ) { - argus = $.extend( {}, argus ); - if ( renderer[ stage ] ) { - renderer[ stage ].call( self, argus, callbacks[ stage ] ); - } else { - callbacks[ stage ]( null ); - } - }; - - proceed( 'before', args ); - }; - - if ( renderer.repeat ) { - repeat = renderer.repeat.split( '.' ); - if ( repeat[ 0 ] === 'data' || repeat[ 0 ] === 'this' ) { - subset = ( repeat[ 0 ] === 'this' ) ? this : data; - repeat.shift(); - } else { - repeat = []; - subset = [ '' ]; - } - - for ( i = 0, l = repeat.length; i < l; i++ ) { - subset = subset[ repeat[ i ] ]; - } - } else { - subset = [ '' ]; - } - - loopSubset( 0 ); - }, - - viewChanged: function( e ) { - var $selected = $( e.target ); - this.render( { - changeView: $selected.val(), - pageIncrement: null - } ); - } - }; - - // REPEATER PLUGIN DEFINITION - - $.fn.repeater = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.repeater' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.repeater', ( data = new Repeater( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.repeater.defaults = { - dataSource: function( options, callback ) {}, - defaultView: -1, //should be a string value. -1 means it will grab the active view from the view controls - dropPagingCap: 10, - staticHeight: -1 //normally true or false. -1 means it will look for data-staticheight on the element - }; - - //views object contains keyed list of view plugins, each an object with following optional parameters: - //{ - //initialize: function(){}, - //selected: function(){}, - //renderer: {} - //} - //renderer object contains following optional parameters: - //{ - //before: function(helpers){}, - //after: function(helpers){}, - //complete: function(helpers){}, - //repeat: 'parameter.subparameter.etc', - //render: function(helpers){}, - //nested: [ *array of renderer objects* ] - //} - - //helpers object structure: - //{ - //container: jQuery object, (current renderer parent) - //data: {...}, (data returned from dataSource) - //index: int, (only there if repeat was set. current item index) - //item: str or jQuery object, (only there if rendered function returned item) - //subset: {}, (only there if repeat was set. subset of data being repeated on) - //} - $.fn.repeater.views = {}; - - $.fn.repeater.Constructor = Repeater; - - $.fn.repeater.noConflict = function() { - $.fn.repeater = old; - return this; - }; - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Repeater - List View Plugin - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - if ( $.fn.repeater ) { - - $.fn.repeater.Constructor.prototype.clearSelectedItems = function() { - this.$canvas.find( '.repeater-list-check' ).remove(); - this.$canvas.find( '.repeater-list-items tr.selected' ).removeClass( 'selected' ); - }; - - $.fn.repeater.Constructor.prototype.getSelectedItems = function() { - var selected = []; - this.$canvas.find( '.repeater-list-items tr.selected' ).each( function() { - var $item = $( this ); - selected.push( { - data: $item.data( 'item_data' ), - element: $item - } ); - } ); - return selected; - }; - - $.fn.repeater.Constructor.prototype.setSelectedItems = function( items, force ) { - var selectable = this.options.list_selectable; - var self = this; - var data, i, $item, l; - - var eachFunc = function() { - $item = $( this ); - data = $item.data( 'item_data' ) || {}; - if ( data[ items[ i ].property ] === items[ i ].value ) { - selectItem( $item, items[ i ].selected ); - } - }; - - var selectItem = function( $itm, select ) { - select = ( select !== undefined ) ? select : true; - if ( select ) { - if ( !force && selectable !== 'multi' ) { - self.clearSelectedItems(); - } - if ( !$itm.hasClass( 'selected' ) ) { - $itm.addClass( 'selected' ); - $itm.find( 'td:first' ).prepend( '<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>' ); - } - } else { - $itm.find( '.repeater-list-check' ).remove(); - $itm.removeClass( 'selected' ); - } - }; - - if ( !$.isArray( items ) ) { - items = [ items ]; - } - if ( force === true || selectable === 'multi' ) { - l = items.length; - } else if ( selectable ) { - l = ( items.length > 0 ) ? 1 : 0; - } else { - l = 0; - } - for ( i = 0; i < l; i++ ) { - if ( items[ i ].index !== undefined ) { - $item = this.$canvas.find( '.repeater-list-items tr:nth-child(' + ( items[ i ].index + 1 ) + ')' ); - if ( $item.length > 0 ) { - selectItem( $item, items[ i ].selected ); - } - } else if ( items[ i ].property !== undefined && items[ i ].value !== undefined ) { - //lint demanded this function not be within this loop - this.$canvas.find( '.repeater-list-items tr' ).each( eachFunc ); - } - } - }; - - $.fn.repeater.defaults = $.extend( {}, $.fn.repeater.defaults, { - list_columnRendered: null, - list_columnSizing: true, - list_columnSyncing: true, - list_infiniteScroll: false, - list_noItemsHTML: '', - list_selectable: false, - list_sortClearing: false, - list_rowRendered: null - } ); - - $.fn.repeater.views.list = { - dataOptions: function( opts, callback ) { - if ( this.list_sortDirection ) { - opts.sortDirection = this.list_sortDirection; - } - if ( this.list_sortProperty ) { - opts.sortProperty = this.list_sortProperty; - } - callback( opts ); - }, - initialize: function( helpers, callback ) { - this.list_sortDirection = null; - this.list_sortProperty = null; - callback(); - }, - selected: function( helpers, callback ) { - var infScroll = this.options.list_infiniteScroll; - var opts; - - this.list_firstRender = true; - this.$loader.addClass( 'noHeader' ); - - if ( infScroll ) { - opts = ( typeof infScroll === 'object' ) ? infScroll : {}; - this.infiniteScrolling( true, opts ); - } - - callback( {} ); - }, - renderer: { - complete: function( helpers, callback ) { - columnSyncing.call( this, helpers, callback ); - }, - nested: [ { - complete: function( helpers, callback ) { - var auto = []; - var self = this; - var i, l, newWidth, taken; - - if ( !this.options.list_columnSizing || this.list_columnsSame ) { - callback(); - } else { - i = 0; - taken = 0; - helpers.item.find( 'td' ).each( function() { - var $col = $( this ); - var isLast = ( $col.next( 'td' ).length === 0 ) ? true : false; - var width; - if ( self.list_columns[ i ].width !== undefined ) { - width = self.list_columns[ i ].width; - $col.outerWidth( width ); - taken += $col.outerWidth(); - if ( !isLast ) { - self.list_columns[ i ]._auto_width = width; - } else { - $col.outerWidth( '' ); - } - } else { - auto.push( { - col: $col, - index: i, - last: isLast - } ); - } - i++; - } ); - - l = auto.length; - if ( l > 0 ) { - newWidth = Math.floor( ( this.$canvas.width() - taken ) / l ); - for ( i = 0; i < l; i++ ) { - if ( !auto[ i ].last ) { - auto[ i ].col.outerWidth( newWidth ); - this.list_columns[ auto[ i ].index ]._auto_width = newWidth; - } - } - } - callback(); - } - }, - render: function( helpers, callback ) { - var differentColumns = function( oldCols, newCols ) { - var i, j, l; - if ( !oldCols ) { - return true; - } - if ( !newCols ) { - return false; - } - for ( i = 0, l = newCols.length; i < l; i++ ) { - if ( !oldCols[ i ] ) { - return true; - } else { - for ( j in newCols[ i ] ) { - if ( oldCols[ i ][ j ] !== newCols[ i ][ j ] ) { - return true; - } - } - } - } - return false; - }; - - if ( this.list_firstRender || differentColumns( this.list_columns, helpers.data.columns ) ) { - this.$element.find( '.repeater-list-header' ).remove(); - this.list_columns = helpers.data.columns; - this.list_columnsSame = false; - this.list_firstRender = false; - this.$loader.removeClass( 'noHeader' ); - callback( { - action: 'prepend', - item: '<table class="table repeater-list-header" data-preserve="deep" role="grid" aria-readonly="true"><tr data-container="true"></tr></table>' - } ); - } else { - this.list_columnsSame = true; - callback( { - skipNested: true - } ); - } - }, - nested: [ { - render: function( helpers, callback ) { - var chev = 'glyphicon-chevron'; - var chevDown = chev + '-down'; - var chevUp = chev + '-up'; - var index = helpers.index; - var self = this; - var subset = helpers.subset; - var cssClass, $item, sortable, $span; - - cssClass = subset[ index ].cssClass; - $item = $( '<td><span class="glyphicon"></span></td>' ); - $item.addClass( ( ( cssClass !== undefined ) ? cssClass : '' ) ).prepend( subset[ index ].label ); - $span = $item.find( 'span.glyphicon:first' ); - - sortable = subset[ index ].sortable; - if ( sortable ) { - $item.addClass( 'sortable' ); - $item.on( 'click.fu.repeater-list', function() { - self.list_sortProperty = ( typeof sortable === 'string' ) ? sortable : subset[ index ].property; - if ( $item.hasClass( 'sorted' ) ) { - if ( $span.hasClass( chevUp ) ) { - $span.removeClass( chevUp ).addClass( chevDown ); - self.list_sortDirection = 'desc'; - } else { - if ( !self.options.list_sortClearing ) { - $span.removeClass( chevDown ).addClass( chevUp ); - self.list_sortDirection = 'asc'; - } else { - $item.removeClass( 'sorted' ); - $span.removeClass( chevDown ); - self.list_sortDirection = null; - self.list_sortProperty = null; - } - } - } else { - helpers.container.find( 'td' ).removeClass( 'sorted' ); - $span.removeClass( chevDown ).addClass( chevUp ); - self.list_sortDirection = 'asc'; - $item.addClass( 'sorted' ); - } - self.render( { - clearInfinite: true, - pageIncrement: null - } ); - } ); - } - if ( subset[ index ].sortDirection === 'asc' || subset[ index ].sortDirection === 'desc' ) { - helpers.container.find( 'td' ).removeClass( 'sorted' ); - $item.addClass( 'sortable sorted' ); - if ( subset[ index ].sortDirection === 'asc' ) { - $span.addClass( chevUp ); - this.list_sortDirection = 'asc'; - } else { - $span.addClass( chevDown ); - this.list_sortDirection = 'desc'; - } - this.list_sortProperty = ( typeof sortable === 'string' ) ? sortable : subset[ index ].property; - } - - callback( { - item: $item - } ); - }, - repeat: 'data.columns' - } ] - }, { - after: function( helpers, callback ) { - var canvas = this.$canvas; - var header = canvas.find( '.repeater-list-header' ); - if ( this.staticHeight ) { - helpers.item.height( canvas.height() - header.outerHeight() ); - } - callback(); - }, - render: function( helpers, callback ) { - var $item = this.$canvas.find( '.repeater-list-wrapper' ); - var obj = {}; - var $empty; - if ( $item.length > 0 ) { - obj.action = 'none'; - } else { - $item = $( '<div class="repeater-list-wrapper" data-infinite="true"><table class="table repeater-list-items" data-container="true" role="grid" aria-readonly="true"></table></div>' ); - } - obj.item = $item; - if ( helpers.data.items.length < 1 ) { - obj.skipNested = true; - $empty = $( '<tr class="empty"><td></td></tr>' ); - $empty.find( 'td' ).append( this.options.list_noItemsHTML ); - $item.find( '.repeater-list-items' ).append( $empty ); - } else { - $item.find( '.repeater-list-items tr.empty:first' ).remove(); - } - callback( obj ); - }, - nested: [ { - complete: function( helpers, callback ) { - var obj = { - container: helpers.container - }; - if ( helpers.item !== undefined ) { - obj.item = helpers.item; - } - if ( this.options.list_rowRendered ) { - this.options.list_rowRendered( obj, function() { - callback(); - } ); - } else { - callback(); - } - }, - render: function( helpers, callback ) { - var $item = $( '<tr data-container="true"></tr>' ); - var self = this; - - if ( this.options.list_selectable ) { - $item.addClass( 'selectable' ); - $item.attr( 'tabindex', 0 ); // allow items to be tabbed to / focused on - $item.data( 'item_data', helpers.subset[ helpers.index ] ); - $item.on( 'click.fu.repeater-list', function() { - var $row = $( this ); - if ( $row.hasClass( 'selected' ) ) { - $row.removeClass( 'selected' ); - $row.find( '.repeater-list-check' ).remove(); - self.$element.trigger( 'itemDeselected.fu.repeater', $row ); - } else { - if ( self.options.list_selectable !== 'multi' ) { - self.$canvas.find( '.repeater-list-check' ).remove(); - self.$canvas.find( '.repeater-list-items tr.selected' ).each( function() { - $( this ).removeClass( 'selected' ); - self.$element.trigger( 'itemDeselected.fu.repeater', $( this ) ); - } ); - } - $row.addClass( 'selected' ); - $row.find( 'td:first' ).prepend( '<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>' ); - self.$element.trigger( 'itemSelected.fu.repeater', $row ); - } - } ); - // allow selection via enter key - $item.keyup( function( e ) { - if ( e.keyCode === 13 ) { - $item.trigger( 'click.fu.repeater-list' ); - } - } ); - } - - - - this.list_curRowIndex = helpers.index; - callback( { - item: $item - } ); - }, - repeat: 'data.items', - nested: [ { - after: function( helpers, callback ) { - var obj = { - container: helpers.container - }; - if ( helpers.item !== undefined ) { - obj.item = helpers.item; - } - if ( this.options.list_columnRendered ) { - this.options.list_columnRendered( obj, function() { - callback(); - } ); - } else { - callback(); - } - }, - render: function( helpers, callback ) { - var cssClass = helpers.subset[ helpers.index ].cssClass; - var content = helpers.data.items[ this.list_curRowIndex ][ helpers.subset[ helpers.index ].property ]; - var $item = $( '<td></td>' ); - var width = helpers.subset[ helpers.index ]._auto_width; - - $item.addClass( ( ( cssClass !== undefined ) ? cssClass : '' ) ).append( content ); - if ( width !== undefined ) { - $item.outerWidth( width ); - } - callback( { - item: $item - } ); - }, - repeat: 'this.list_columns' - } ] - } ] - } ] - }, - resize: function( helpers, callback ) { - columnSyncing.call( this, { - data: { - items: [ '' ] - } - }, callback ); - } - }; - - var columnSyncing = function( helpers, callback ) { - var i = 0; - var widths = []; - var $header, $items; - - if ( !this.options.list_columnSyncing || ( helpers.data.items.length < 1 ) ) { - callback(); - } else { - $header = this.$element.find( '.repeater-list-header:first' ); - $items = this.$element.find( '.repeater-list-items:first' ); - $items.find( 'tr:first td' ).each( function() { - widths.push( $( this ).outerWidth() ); - } ); - widths.pop(); - $header.find( 'td' ).each( function() { - if ( widths[ i ] !== undefined ) { - $( this ).outerWidth( widths[ i ] ); - } - i++; - } ); - callback(); - } - }; - } - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Repeater - Thumbnail View Plugin - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - if ( $.fn.repeater ) { - - $.fn.repeater.defaults = $.extend( {}, $.fn.repeater.defaults, { - thumbnail_infiniteScroll: false, - thumbnail_itemRendered: null, - thumbnail_template: '<div class="thumbnail repeater-thumbnail" style="background-color: {{color}};"><img height="75" src="{{src}}" width="65"><span>{{name}}</span></div>' - } ); - - $.fn.repeater.views.thumbnail = { - selected: function( helpers, callback ) { - var infScroll = this.options.thumbnail_infiniteScroll; - var opts; - if ( infScroll ) { - opts = ( typeof infScroll === 'object' ) ? infScroll : {}; - this.infiniteScrolling( true, opts ); - } - callback( {} ); - }, - renderer: { - render: function( helpers, callback ) { - var $item = this.$element.find( '.repeater-thumbnail-cont' ); - var obj = {}; - var $empty; - if ( $item.length > 0 ) { - obj.action = 'none'; - } else { - $item = $( '<div class="clearfix repeater-thumbnail-cont" data-container="true" data-infinite="true" data-preserve="shallow"></div>' ); - } - obj.item = $item; - if ( helpers.data.items.length < 1 ) { - obj.skipNested = true; - $empty = $( '<div class="empty"></div>' ); - $empty.append( this.options.thumbnail_noItemsHTML ); - $item.append( $empty ); - } else { - $item.find( '.empty:first' ).remove(); - } - callback( obj ); - }, - nested: [ { - after: function( helpers, callback ) { - var obj = { - container: helpers.container - }; - if ( helpers.item !== undefined ) { - obj.item = helpers.item; - } - if ( this.options.thumbnail_itemRendered ) { - this.options.thumbnail_itemRendered( obj, function() { - callback(); - } ); - } else { - callback(); - } - }, - render: function( helpers, callback ) { - var item = helpers.subset[ helpers.index ]; - var template = function( str ) { - var invalid = false; - var replace = function() { - var end, start, val; - - start = str.indexOf( '{{' ); - end = str.indexOf( '}}', start + 2 ); - - if ( start > -1 && end > -1 ) { - val = $.trim( str.substring( start + 2, end ) ); - val = ( item[ val ] !== undefined ) ? item[ val ] : ''; - str = str.substring( 0, start ) + val + str.substring( end + 2 ); - } else { - invalid = true; - } - }; - - while ( !invalid && str.search( '{{' ) >= 0 ) { - replace( str ); - } - return str; - }; - callback( { - item: template( this.options.thumbnail_template ) - } ); - }, - repeat: 'data.items' - } ] - } - }; - - } - - - } )( jQuery ); - - - ( function( $ ) { - - /* - * Fuel UX Scheduler - * https://github.com/ExactTarget/fuelux - * - * Copyright (c) 2014 ExactTarget - * Licensed under the BSD New license. - */ - - - - // -- BEGIN MODULE CODE HERE -- - - var old = $.fn.scheduler; - - // SCHEDULER CONSTRUCTOR AND PROTOTYPE - - var Scheduler = function( element, options ) { - var self = this; - - this.$element = $( element ); - this.options = $.extend( {}, $.fn.scheduler.defaults, options ); - - // cache elements - this.$startDate = this.$element.find( '.start-datetime .start-date' ); - this.$startTime = this.$element.find( '.start-datetime .start-time' ); - - this.$timeZone = this.$element.find( '.timezone-container .timezone' ); - - this.$repeatIntervalPanel = this.$element.find( '.repeat-every-panel' ); - this.$repeatIntervalSelect = this.$element.find( '.repeat-options' ); - - this.$repeatIntervalSpinbox = this.$element.find( '.repeat-every' ); - this.$repeatIntervalTxt = this.$element.find( '.repeat-every-text' ); - - this.$end = this.$element.find( '.repeat-end' ); - this.$endSelect = this.$end.find( '.end-options' ); - this.$endAfter = this.$end.find( '.end-after' ); - this.$endDate = this.$end.find( '.end-on-date' ); - - // panels - this.$recurrencePanels = this.$element.find( '.repeat-panel' ); - - - this.$repeatIntervalSelect.selectlist(); - - //initialize sub-controls - this.$element.find( '.selectlist' ).selectlist(); - this.$startDate.datepicker(); - this.$startTime.combobox(); - // init start time - if ( this.$startTime.find( 'input' ).val() === '' ) { - this.$startTime.combobox( 'selectByIndex', 0 ); - } - // every 0 days/hours doesn't make sense, change if not set - if ( this.$repeatIntervalSpinbox.find( 'input' ).val() === '0' ) { - this.$repeatIntervalSpinbox.spinbox( { - 'value': 1, - 'min': 1 - } ); - } else { - this.$repeatIntervalSpinbox.spinbox( { - 'min': 1 - } ); - } - this.$endAfter.spinbox( { - 'value': 1, - 'min': 1 - } ); - this.$endDate.datepicker(); - this.$element.find( '.radio-custom' ).radio(); - - // bind events: 'change' is a Bootstrap JS fired event - this.$repeatIntervalSelect.on( 'changed.fu.selectlist', $.proxy( this.repeatIntervalSelectChanged, this ) ); - this.$endSelect.on( 'changed.fu.selectlist', $.proxy( this.endSelectChanged, this ) ); - this.$element.find( '.repeat-days-of-the-week .btn-group .btn' ).on( 'change.fu.scheduler', function( e, data ) { - self.changed( e, data, true ); - } ); - this.$element.find( '.combobox' ).on( 'changed.fu.combobox', $.proxy( this.changed, this ) ); - this.$element.find( '.datepicker' ).on( 'changed.fu.datepicker', $.proxy( this.changed, this ) ); - this.$element.find( '.selectlist' ).on( 'changed.fu.selectlist', $.proxy( this.changed, this ) ); - this.$element.find( '.spinbox' ).on( 'changed.fu.spinbox', $.proxy( this.changed, this ) ); - this.$element.find( '.repeat-monthly .radio, .repeat-yearly .radio' ).on( 'change.fu.scheduler', $.proxy( this.changed, this ) ); - - }; - - Scheduler.prototype = { - constructor: Scheduler, - - destroy: function() { - - var markup; - // set input value attribute - this.$element.find( 'input' ).each( function() { - $( this ).attr( 'value', $( this ).val() ); - } ); - - // empty elements to return to original markup and store - this.$element.find( '.datepicker .calendar' ).empty(); - - markup = this.$element[ 0 ].outerHTML; - - // destroy components - this.$element.find( '.combobox' ).combobox( 'destroy' ); - this.$element.find( '.datepicker' ).datepicker( 'destroy' ); - this.$element.find( '.selectlist' ).selectlist( 'destroy' ); - this.$element.find( '.spinbox' ).spinbox( 'destroy' ); - this.$element.find( '[type=radio]' ).radio( 'destroy' ); - this.$element.remove(); - - // any external bindings - // [none] - - return markup; - }, - - changed: function( e, data, propagate ) { - if ( !propagate ) { - e.stopPropagation(); - } - this.$element.trigger( 'changed.fu.scheduler', { - data: ( data !== undefined ) ? data : $( e.currentTarget ).data(), - originalEvent: e, - value: this.getValue() - } ); - }, - - disable: function() { - this.toggleState( 'disable' ); - }, - - enable: function() { - this.toggleState( 'enable' ); - }, - - // called when the end range changes - // (Never, After, On date) - endSelectChanged: function( e, data ) { - var selectedItem, val; - - if ( !data ) { - selectedItem = this.$endSelect.selectlist( 'selectedItem' ); - val = selectedItem.value; - } else { - val = data.value; - } - - // hide all panels - this.$endAfter.parent().addClass( 'hide' ); - this.$endAfter.parent().attr( 'aria-hidden', 'true' ); - - this.$endDate.parent().addClass( 'hide' ); - this.$endDate.parent().attr( 'aria-hidden', 'true' ); - - if ( val === 'after' ) { - this.$endAfter.parent().removeClass( 'hide' ); - this.$endAfter.parent().attr( 'aria-hidden', 'false' ); - } else if ( val === 'date' ) { - this.$endDate.parent().removeClass( 'hide' ); - this.$endDate.parent().attr( 'aria-hidden', 'false' ); - } - }, - - getValue: function() { - // FREQ = frequency (hourly, daily, monthly...) - // BYDAY = when picking days (MO,TU,WE,etc) - // BYMONTH = when picking months (Jan,Feb,March) - note the values should be 1,2,3... - // BYMONTHDAY = when picking days of the month (1,2,3...) - // BYSETPOS = when picking First,Second,Third,Fourth,Last (1,2,3,4,-1) - - var interval = this.$repeatIntervalSpinbox.spinbox( 'value' ); - var pattern = ''; - var repeat = this.$repeatIntervalSelect.selectlist( 'selectedItem' ).value; - var startTime = this.$startTime.combobox( 'selectedItem' ).text.toLowerCase(); - var timeZone = this.$timeZone.selectlist( 'selectedItem' ); - var getFormattedDate; - - getFormattedDate = function( dateObj, dash ) { - var fdate = ''; - var item; - - fdate += dateObj.getFullYear(); - fdate += dash; - item = dateObj.getMonth() + 1; //because 0 indexing makes sense when dealing with months /sarcasm - fdate += ( item < 10 ) ? '0' + item : item; - fdate += dash; - item = dateObj.getDate(); - fdate += ( item < 10 ) ? '0' + item : item; - - return fdate; - }; - - var day, days, hasAm, hasPm, month, pos, startDateTime, type; - - startDateTime = '' + getFormattedDate( this.$startDate.datepicker( 'getDate' ), '-' ); - - startDateTime += 'T'; - hasAm = ( startTime.search( 'am' ) >= 0 ); - hasPm = ( startTime.search( 'pm' ) >= 0 ); - startTime = $.trim( startTime.replace( /am/g, '' ).replace( /pm/g, '' ) ).split( ':' ); - startTime[ 0 ] = parseInt( startTime[ 0 ], 10 ); - startTime[ 1 ] = parseInt( startTime[ 1 ], 10 ); - if ( hasAm && startTime[ 0 ] > 11 ) { - startTime[ 0 ] = 0; - } else if ( hasPm && startTime[ 0 ] < 12 ) { - startTime[ 0 ] += 12; - } - startDateTime += ( startTime[ 0 ] < 10 ) ? '0' + startTime[ 0 ] : startTime[ 0 ]; - startDateTime += ':'; - startDateTime += ( startTime[ 1 ] < 10 ) ? '0' + startTime[ 1 ] : startTime[ 1 ]; - - startDateTime += ( timeZone.offset === '+00:00' ) ? 'Z' : timeZone.offset; - - if ( repeat === 'none' ) { - pattern = 'FREQ=DAILY;INTERVAL=1;COUNT=1;'; - } else if ( repeat === 'hourly' ) { - pattern = 'FREQ=HOURLY;'; - pattern += 'INTERVAL=' + interval + ';'; - } else if ( repeat === 'daily' ) { - pattern += 'FREQ=DAILY;'; - pattern += 'INTERVAL=' + interval + ';'; - } else if ( repeat === 'weekdays' ) { - pattern += 'FREQ=DAILY;'; - pattern += 'BYDAY=MO,TU,WE,TH,FR;'; - pattern += 'INTERVAL=1;'; - } else if ( repeat === 'weekly' ) { - days = []; - this.$element.find( '.repeat-days-of-the-week .btn-group input:checked' ).each( function() { - days.push( $( this ).data().value ); - } ); - - pattern += 'FREQ=WEEKLY;'; - pattern += 'BYDAY=' + days.join( ',' ) + ';'; - pattern += 'INTERVAL=' + interval + ';'; - } else if ( repeat === 'monthly' ) { - pattern += 'FREQ=MONTHLY;'; - pattern += 'INTERVAL=' + interval + ';'; - type = this.$element.find( 'input[name=repeat-monthly]:checked' ).val(); - - if ( type === 'bymonthday' ) { - day = parseInt( this.$element.find( '.repeat-monthly-date .selectlist' ).selectlist( 'selectedItem' ).text, 10 ); - pattern += 'BYMONTHDAY=' + day + ';'; - } else if ( type === 'bysetpos' ) { - days = this.$element.find( '.month-days' ).selectlist( 'selectedItem' ).value; - pos = this.$element.find( '.month-day-pos' ).selectlist( 'selectedItem' ).value; - pattern += 'BYDAY=' + days + ';'; - pattern += 'BYSETPOS=' + pos + ';'; - } - - } else if ( repeat === 'yearly' ) { - pattern += 'FREQ=YEARLY;'; - type = this.$element.find( 'input[name=repeat-yearly]:checked' ).val(); - - if ( type === 'bymonthday' ) { - month = this.$element.find( '.repeat-yearly-date .year-month' ).selectlist( 'selectedItem' ).value; - day = this.$element.find( '.year-month-day' ).selectlist( 'selectedItem' ).text; - pattern += 'BYMONTH=' + month + ';'; - pattern += 'BYMONTHDAY=' + day + ';'; - } else if ( type === 'bysetpos' ) { - days = this.$element.find( '.year-month-days' ).selectlist( 'selectedItem' ).value; - pos = this.$element.find( '.year-month-day-pos' ).selectlist( 'selectedItem' ).value; - month = this.$element.find( '.repeat-yearly-day .year-month' ).selectlist( 'selectedItem' ).value; - - pattern += 'BYDAY=' + days + ';'; - pattern += 'BYSETPOS=' + pos + ';'; - pattern += 'BYMONTH=' + month + ';'; - } - - } - - var end = this.$endSelect.selectlist( 'selectedItem' ).value; - var duration = ''; - - // if both UNTIL and COUNT are not specified, the recurrence will repeat forever - // http://tools.ietf.org/html/rfc2445#section-4.3.10 - if ( repeat !== 'none' ) { - if ( end === 'after' ) { - duration = 'COUNT=' + this.$endAfter.spinbox( 'value' ) + ';'; - } else if ( end === 'date' ) { - duration = 'UNTIL=' + getFormattedDate( this.$endDate.datepicker( 'getDate' ), '' ) + ';'; - } - } - - pattern += duration; - - var data = { - startDateTime: startDateTime, - timeZone: { - name: timeZone.name, - offset: timeZone.offset - }, - recurrencePattern: pattern - }; - - return data; - }, - - // called when the repeat interval changes - // (None, Hourly, Daily, Weekdays, Weekly, Monthly, Yearly - repeatIntervalSelectChanged: function( e, data ) { - var selectedItem, val, txt; - - if ( !data ) { - selectedItem = this.$repeatIntervalSelect.selectlist( 'selectedItem' ); - val = selectedItem.value; - txt = selectedItem.text; - } else { - val = data.value; - txt = data.text; - } - - // set the text - this.$repeatIntervalTxt.text( txt ); - - switch ( val.toLowerCase() ) { - case 'hourly': - case 'daily': - case 'weekly': - case 'monthly': - this.$repeatIntervalPanel.removeClass( 'hide' ); - this.$repeatIntervalPanel.attr( 'aria-hidden', 'false' ); - break; - default: - this.$repeatIntervalPanel.addClass( 'hide' ); - this.$repeatIntervalPanel.attr( 'aria-hidden', 'true' ); - break; - } - - // hide all panels - this.$recurrencePanels.addClass( 'hide' ); - this.$recurrencePanels.attr( 'aria-hidden', 'true' ); - - // show panel for current selection - this.$element.find( '.repeat-' + val ).removeClass( 'hide' ); - this.$element.find( '.repeat-' + val ).attr( 'aria-hidden', 'false' ); - - // the end selection should only be shown when - // the repeat interval is not "None (run once)" - if ( val === 'none' ) { - this.$end.addClass( 'hide' ); - this.$end.attr( 'aria-hidden', 'true' ); - } else { - this.$end.removeClass( 'hide' ); - this.$end.attr( 'aria-hidden', 'false' ); - } - }, - - setValue: function( options ) { - var hours, i, item, l, minutes, period, recur, temp; - - if ( options.startDateTime ) { - temp = options.startDateTime.split( 'T' ); - this.$startDate.datepicker( 'setDate', temp[ 0 ] ); - - if ( temp[ 1 ] ) { - temp[ 1 ] = temp[ 1 ].split( ':' ); - hours = parseInt( temp[ 1 ][ 0 ], 10 ); - minutes = ( temp[ 1 ][ 1 ] ) ? parseInt( temp[ 1 ][ 1 ].split( '+' )[ 0 ].split( '-' )[ 0 ].split( 'Z' )[ 0 ], 10 ) : 0; - period = ( hours < 12 ) ? 'AM' : 'PM'; - - if ( hours === 0 ) { - hours = 12; - } else if ( hours > 12 ) { - hours -= 12; - } - minutes = ( minutes < 10 ) ? '0' + minutes : minutes; - - temp = hours + ':' + minutes + ' ' + period; - this.$startTime.find( 'input' ).val( temp ); - this.$startTime.combobox( 'selectByText', temp ); - } - } - - item = 'li[data'; - if ( options.timeZone ) { - if ( typeof( options.timeZone ) === 'string' ) { - item += '-name="' + options.timeZone; - } else { - if ( options.timeZone.name ) { - item += '-name="' + options.timeZone.name; - } else { - item += '-offset="' + options.timeZone.offset; - } - } - item += '"]'; - this.$timeZone.selectlist( 'selectBySelector', item ); - } else if ( options.startDateTime ) { - temp = options.startDateTime.split( 'T' )[ 1 ]; - if ( temp ) { - if ( temp.search( /\+/ ) > -1 ) { - temp = '+' + $.trim( temp.split( '+' )[ 1 ] ); - } else if ( temp.search( /\-/ ) > -1 ) { - temp = '-' + $.trim( temp.split( '-' )[ 1 ] ); - } else { - temp = '+00:00'; - } - } else { - temp = '+00:00'; - } - item += '-offset="' + temp + '"]'; - this.$timeZone.selectlist( 'selectBySelector', item ); - } - - if ( options.recurrencePattern ) { - recur = {}; - temp = options.recurrencePattern.toUpperCase().split( ';' ); - for ( i = 0, l = temp.length; i < l; i++ ) { - if ( temp[ i ] !== '' ) { - item = temp[ i ].split( '=' ); - recur[ item[ 0 ] ] = item[ 1 ]; - } - } - - if ( recur.FREQ === 'DAILY' ) { - if ( recur.BYDAY === 'MO,TU,WE,TH,FR' ) { - item = 'weekdays'; - } else { - if ( recur.INTERVAL === '1' && recur.COUNT === '1' ) { - item = 'none'; - } else { - item = 'daily'; - } - } - } else if ( recur.FREQ === 'HOURLY' ) { - item = 'hourly'; - } else if ( recur.FREQ === 'WEEKLY' ) { - if ( recur.BYDAY ) { - item = this.$element.find( '.repeat-days-of-the-week .btn-group' ); - item.find( 'label' ).removeClass( 'active' ); - temp = recur.BYDAY.split( ',' ); - for ( i = 0, l = temp.length; i < l; i++ ) { - item.find( 'input[data-value="' + temp[ i ] + '"]' ).parent().addClass( 'active' ); - } - } - item = 'weekly'; - } else if ( recur.FREQ === 'MONTHLY' ) { - this.$element.find( '.repeat-monthly input' ).removeAttr( 'checked' ).removeClass( 'checked' ); - this.$element.find( '.repeat-monthly label.radio-custom' ).removeClass( 'checked' ); - if ( recur.BYMONTHDAY ) { - temp = this.$element.find( '.repeat-monthly-date' ); - temp.find( 'input' ).addClass( 'checked' ).attr( 'checked', 'checked' ); - temp.find( 'label.radio-custom' ).addClass( 'checked' ); - temp.find( '.selectlist' ).selectlist( 'selectByValue', recur.BYMONTHDAY ); - } else if ( recur.BYDAY ) { - temp = this.$element.find( '.repeat-monthly-day' ); - temp.find( 'input' ).addClass( 'checked' ).attr( 'checked', 'checked' ); - temp.find( 'label.radio-custom' ).addClass( 'checked' ); - if ( recur.BYSETPOS ) { - temp.find( '.month-day-pos' ).selectlist( 'selectByValue', recur.BYSETPOS ); - } - temp.find( '.month-days' ).selectlist( 'selectByValue', recur.BYDAY ); - } - item = 'monthly'; - } else if ( recur.FREQ === 'YEARLY' ) { - this.$element.find( '.repeat-yearly input' ).removeAttr( 'checked' ).removeClass( 'checked' ); - this.$element.find( '.repeat-yearly label.radio-custom' ).removeClass( 'checked' ); - if ( recur.BYMONTHDAY ) { - temp = this.$element.find( '.repeat-yearly-date' ); - temp.find( 'input' ).addClass( 'checked' ).attr( 'checked', 'checked' ); - temp.find( 'label.radio-custom' ).addClass( 'checked' ); - if ( recur.BYMONTH ) { - temp.find( '.year-month' ).selectlist( 'selectByValue', recur.BYMONTH ); - } - temp.find( '.year-month-day' ).selectlist( 'selectByValue', recur.BYMONTHDAY ); - } else if ( recur.BYSETPOS ) { - temp = this.$element.find( '.repeat-yearly-day' ); - temp.find( 'input' ).addClass( 'checked' ).attr( 'checked', 'checked' ); - temp.find( 'label.radio-custom' ).addClass( 'checked' ); - temp.find( '.year-month-day-pos' ).selectlist( 'selectByValue', recur.BYSETPOS ); - if ( recur.BYDAY ) { - temp.find( '.year-month-days' ).selectlist( 'selectByValue', recur.BYDAY ); - } - if ( recur.BYMONTH ) { - temp.find( '.year-month' ).selectlist( 'selectByValue', recur.BYMONTH ); - } - } - item = 'yearly'; - } else { - item = 'none'; - } - - if ( recur.COUNT ) { - this.$endAfter.spinbox( 'value', parseInt( recur.COUNT, 10 ) ); - this.$endSelect.selectlist( 'selectByValue', 'after' ); - } else if ( recur.UNTIL ) { - temp = recur.UNTIL; - if ( temp.length === 8 ) { - temp = temp.split( '' ); - temp.splice( 4, 0, '-' ); - temp.splice( 7, 0, '-' ); - temp = temp.join( '' ); - } - this.$endDate.datepicker( 'setDate', temp ); - this.$endSelect.selectlist( 'selectByValue', 'date' ); - } - this.endSelectChanged(); - - if ( recur.INTERVAL ) { - this.$repeatIntervalSpinbox.spinbox( 'value', parseInt( recur.INTERVAL, 10 ) ); - } - this.$repeatIntervalSelect.selectlist( 'selectByValue', item ); - this.repeatIntervalSelectChanged(); - } - }, - - toggleState: function( action ) { - this.$element.find( '.combobox' ).combobox( action ); - this.$element.find( '.datepicker' ).datepicker( action ); - this.$element.find( '.selectlist' ).selectlist( action ); - this.$element.find( '.spinbox' ).spinbox( action ); - this.$element.find( '[type=radio]' ).radio( action ); - - if ( action === 'disable' ) { - action = 'addClass'; - } else { - action = 'removeClass'; - } - this.$element.find( '.repeat-days-of-the-week .btn-group' )[ action ]( 'disabled' ); - }, - - value: function( options ) { - if ( options ) { - return this.setValue( options ); - } else { - return this.getValue(); - } - } - }; - - - // SCHEDULER PLUGIN DEFINITION - - $.fn.scheduler = function( option ) { - var args = Array.prototype.slice.call( arguments, 1 ); - var methodReturn; - - var $set = this.each( function() { - var $this = $( this ); - var data = $this.data( 'fu.scheduler' ); - var options = typeof option === 'object' && option; - - if ( !data ) $this.data( 'fu.scheduler', ( data = new Scheduler( this, options ) ) ); - if ( typeof option === 'string' ) methodReturn = data[ option ].apply( data, args ); - } ); - - return ( methodReturn === undefined ) ? $set : methodReturn; - }; - - $.fn.scheduler.defaults = {}; - - $.fn.scheduler.Constructor = Scheduler; - - $.fn.scheduler.noConflict = function() { - $.fn.scheduler = old; - return this; - }; - - - // DATA-API - - $( document ).on( 'mousedown.fu.scheduler.data-api', '[data-initialize=scheduler]', function( e ) { - var $control = $( e.target ).closest( '.scheduler' ); - if ( !$control.data( 'fu.scheduler' ) ) { - $control.scheduler( $control.data() ); - } - } ); - - // Must be domReady for AMD compatibility - $( function() { - $( '[data-initialize=scheduler]' ).each( function() { - var $this = $( this ); - if ( $this.data( 'scheduler' ) ) return; - $this.scheduler( $this.data() ); - } ); - } ); - - - - } )( jQuery ); - - -} ) ); diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.min.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.min.js deleted file mode 100644 index b4694af73d4122b5291f128c4828811b8bfa0312..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/fuelux/js/fuelux.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Fuel UX v3.0.2 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ -!function(a){"function"==typeof define&&define.amd?define(["jquery","bootstrap"],a):a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("Fuel UX's JavaScript requires jQuery");if("undefined"==typeof a.fn.dropdown||"undefined"==typeof a.fn.collapse)throw new Error("Fuel UX's JavaScript requires Bootstrap");!function(a){var b=a.fn.checkbox,c=function(b,c){this.options=a.extend({},a.fn.checkbox.defaults,c),this.$element=a(b).is('input[type="checkbox"]')?a(b):a(b).find('input[type="checkbox"]:first'),this.$label=this.$element.parent(),this.$parent=this.$label.parent(".checkbox"),this.$toggleContainer=this.$element.attr("data-toggle"),this.state={disabled:!1,checked:!1},0===this.$parent.length&&(this.$parent=null),this.$toggleContainer=Boolean(this.$toggleContainer)?a(this.$toggleContainer):null,this.$element.on("change.fu.checkbox",a.proxy(this.itemchecked,this)),this.setState()};c.prototype={constructor:c,setState:function(a){a=a||this.$element,this.state.disabled=Boolean(a.prop("disabled")),this.state.checked=Boolean(a.is(":checked")),this._resetClasses(),this._toggleCheckedState(),this._toggleDisabledState(),this.toggleContainer()},enable:function(){this.state.disabled=!1,this.$element.attr("disabled",!1),this._resetClasses(),this.$element.trigger("enabled.fu.checkbox")},disable:function(){this.state.disabled=!0,this.$element.attr("disabled",!0),this._setDisabledClass(),this.$element.trigger("disabled.fu.checkbox")},check:function(){this.state.checked=!0,this.$element.prop("checked",!0),this._setCheckedClass(),this.$element.trigger("checked.fu.checkbox")},uncheck:function(){this.state.checked=!1,this.$element.prop("checked",!1),this._resetClasses(),this.$element.trigger("unchecked.fu.checkbox")},isChecked:function(){return this.state.checked},toggle:function(){this.state.checked=!this.state.checked,this._toggleCheckedState()},toggleContainer:function(){Boolean(this.$toggleContainer)&&(this.state.checked?(this.$toggleContainer.removeClass("hide"),this.$toggleContainer.attr("aria-hidden","false")):(this.$toggleContainer.addClass("hide"),this.$toggleContainer.attr("aria-hidden","true")))},itemchecked:function(b){this.setState(a(b.target))},destroy:function(){return this.$parent.remove(),this.$parent[0].outerHTML},_resetClasses:function(){var a=[];this.state.checked||a.push("checked"),this.state.disabled||a.push("disabled"),a=a.join(" "),this.$label.removeClass(a),this.$parent&&this.$parent.removeClass(a)},_toggleCheckedState:function(){this.state.checked?this.check():this.uncheck()},_toggleDisabledState:function(){this.state.disabled?this.disable():this.enable()},_setCheckedClass:function(){this.$label.addClass("checked"),this.$parent&&this.$parent.addClass("checked")},_setDisabledClass:function(){this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")}},a.fn.checkbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.checkbox"),h="object"==typeof b&&b;g||f.data("fu.checkbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.checkbox.defaults={},a.fn.checkbox.Constructor=c,a.fn.checkbox.noConflict=function(){return a.fn.checkbox=b,this},a(document).on("mouseover.fu.checkbox.data-api","[data-initialize=checkbox]",function(b){var c=a(b.target).closest(".checkbox").find("[type=checkbox]");c.data("fu.checkbox")||c.checkbox(c.data())}),a(function(){a("[data-initialize=checkbox] [type=checkbox]").each(function(){var b=a(this);b.data("fu.checkbox")||b.checkbox(b.data())})})}(a),function(a){var b=a.fn.combobox,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.combobox.defaults,c),this.$dropMenu=this.$element.find(".dropdown-menu"),this.$input=this.$element.find("input"),this.$button=this.$element.find(".btn"),this.$element.on("click.fu.combobox","a",a.proxy(this.itemclicked,this)),this.$element.on("change.fu.combobox","input",a.proxy(this.inputchanged,this)),this.$element.on("shown.bs.dropdown",a.proxy(this.menuShown,this)),this.setDefaultSelection()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},doSelect:function(a){"undefined"!=typeof a[0]?(this.$selectedItem=a,this.$input.val(this.$selectedItem.text())):this.$selectedItem=null},menuShown:function(){this.options.autoResizeMenu&&this.resizeMenu()},resizeMenu:function(){var a=this.$element.outerWidth();this.$dropMenu.outerWidth(a)},selectedItem:function(){var b=this.$selectedItem,c={};if(b){var d=this.$selectedItem.text();c=a.extend({text:d},this.$selectedItem.data())}else c={text:this.$input.val()};return c},selectByText:function(b){var c=a([]);this.$element.find("li").each(function(){return(this.textContent||this.innerText||a(this).text()||"").toLowerCase()===(b||"").toLowerCase()?(c=a(this),!1):void 0}),this.doSelect(c)},selectByValue:function(a){var b='li[data-value="'+a+'"]';this.selectBySelector(b)},selectByIndex:function(a){var b="li:eq("+a+")";this.selectBySelector(b)},selectBySelector:function(a){var b=this.$element.find(a);this.doSelect(b)},setDefaultSelection:function(){var a="li[data-selected=true]:first",b=this.$element.find(a);b.length>0&&(this.selectBySelector(a),b.removeData("selected"),b.removeAttr("data-selected"))},enable:function(){this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$button.removeClass("disabled")},disable:function(){this.$element.addClass("disabled"),this.$input.attr("disabled",!0),this.$button.addClass("disabled")},itemclicked:function(b){this.$selectedItem=a(b.target).parent(),this.$input.val(this.$selectedItem.text()).trigger("change",{synthetic:!0});var c=this.selectedItem();this.$element.trigger("changed.fu.combobox",c),b.preventDefault(),this.$element.find(".dropdown-toggle").focus()},inputchanged:function(b,c){if(!c||!c.synthetic){var d=a(b.target).val();this.selectByText(d);var e=this.selectedItem();0===e.text.length&&(e={text:d}),this.$element.trigger("changed.fu.combobox",e)}}},a.fn.combobox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.combobox"),h="object"==typeof b&&b;g||f.data("fu.combobox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.combobox.defaults={autoResizeMenu:!0},a.fn.combobox.Constructor=c,a.fn.combobox.noConflict=function(){return a.fn.combobox=b,this},a(document).on("mousedown.fu.combobox.data-api","[data-initialize=combobox]",function(b){var c=a(b.target).closest(".combobox");c.data("fu.combobox")||c.combobox(c.data())}),a(function(){a("[data-initialize=combobox]").each(function(){var b=a(this);b.data("fu.combobox")||b.combobox(b.data())})})}(a),function(a){var b="Invalid Date",c="moment.js is not available so you cannot use this function",d=[],e=!1,f=a.fn.datepicker,g=!1,h=function(){var a,b;for(g=!0,a=0,b=d.length;b>a;a++)d[a].init.call(d[a].scope);d=[]};"function"==typeof define&&define.amd?require(["moment"],function(a){e=a,h()},function(a){var b=a.requireModules&&a.requireModules[0];"moment"===b&&h()}):h();var i=function(b,c){this.$element=a(b),this.options=a.extend(!0,{},a.fn.datepicker.defaults,c),this.$calendar=this.$element.find(".datepicker-calendar"),this.$days=this.$calendar.find(".datepicker-calendar-days"),this.$header=this.$calendar.find(".datepicker-calendar-header"),this.$headerTitle=this.$header.find(".title"),this.$input=this.$element.find("input"),this.$wheels=this.$element.find(".datepicker-wheels"),this.$wheelsMonth=this.$element.find(".datepicker-wheels-month"),this.$wheelsYear=this.$element.find(".datepicker-wheels-year"),this.artificialScrolling=!1,this.formatDate=this.options.formatDate||this.formatDate,this.inputValue=null,this.moment=!1,this.momentFormat=null,this.parseDate=this.options.parseDate||this.parseDate,this.preventBlurHide=!1,this.restricted=this.options.restricted||[],this.restrictedParsed=[],this.restrictedText=this.options.restrictedText,this.sameYearOnly=this.options.sameYearOnly,this.selectedDate=null,this.yearRestriction=null,this.$calendar.find(".datepicker-today").on("click.fu.datepicker",a.proxy(this.todayClicked,this)),this.$days.on("click.fu.datepicker","tr td button",a.proxy(this.dateClicked,this)),this.$element.find(".dropdown-menu").on("mousedown.fu.datepicker",a.proxy(this.dropdownMousedown,this)),this.$header.find(".next").on("click.fu.datepicker",a.proxy(this.next,this)),this.$header.find(".prev").on("click.fu.datepicker",a.proxy(this.prev,this)),this.$headerTitle.on("click.fu.datepicker",a.proxy(this.titleClicked,this)),this.$input.on("blur.fu.datepicker",a.proxy(this.inputBlurred,this)),this.$input.on("focus.fu.datepicker",a.proxy(this.inputFocused,this)),this.$wheels.find(".datepicker-wheels-back").on("click.fu.datepicker",a.proxy(this.backClicked,this)),this.$wheels.find(".datepicker-wheels-select").on("click.fu.datepicker",a.proxy(this.selectClicked,this)),this.$wheelsMonth.on("click.fu.datepicker","ul button",a.proxy(this.monthClicked,this)),this.$wheelsYear.on("click.fu.datepicker","ul button",a.proxy(this.yearClicked,this)),this.$wheelsYear.find("ul").on("scroll.fu.datepicker",a.proxy(this.onYearScroll,this));var f=function(){this.checkForMomentJS()&&(e=e||window.moment,this.moment=!0,this.momentFormat=this.options.momentConfig.format,this.setCulture(this.options.momentConfig.culture)),this.setRestrictedDates(this.restricted),this.setDate(this.options.date)||(this.$input.val(""),this.inputValue=this.$input.val()),this.sameYearOnly&&(this.yearRestriction=this.selectedDate?this.selectedDate.getFullYear():(new Date).getFullYear())};g?f.call(this):d.push({init:f,scope:this})};i.prototype={constructor:i,backClicked:function(){this.changeView("calendar")},changeView:function(a,b){"wheels"===a?(this.$calendar.hide().attr("aria-hidden","true"),this.$wheels.show().removeAttr("aria-hidden",""),b&&this.renderWheel(b)):(this.$wheels.hide().attr("aria-hidden","true"),this.$calendar.show().removeAttr("aria-hidden",""),b&&this.renderMonth(b))},checkForMomentJS:function(){return(a.isFunction(window.moment)||"undefined"!=typeof e&&a.isFunction(e))&&a.isPlainObject(this.options.momentConfig)&&this.options.momentConfig.culture&&this.options.momentConfig.format?!0:!1},dateClicked:function(b){var c,d=a(b.currentTarget).parents("td:first");d.hasClass("restricted")||(this.$days.find("td.selected").removeClass("selected"),d.addClass("selected"),c=new Date(d.attr("data-year"),d.attr("data-month"),d.attr("data-date")),this.selectedDate=c,this.$input.val(this.formatDate(c)),this.inputValue=this.$input.val(),this.$input.focus())},destroy:function(){return this.$element.remove(),this.$days.find("tbody").empty(),this.$wheelsYear.find("ul").empty(),this.$element[0].outerHTML},disable:function(){this.$element.addClass("disabled"),this.$element.find("input, button").attr("disabled","disabled"),this.$element.find(".input-group-btn").removeClass("open")},dropdownMousedown:function(){var a=this;this.preventBlurHide=!0,setTimeout(function(){a.preventBlurHide=!1},0)},enable:function(){this.$element.removeClass("disabled"),this.$element.find("input, button").removeAttr("disabled")},formatDate:function(a){var b=function(a){var b="0"+a;return b.substr(b.length-2)};return this.moment?e(a).format(this.momentFormat):b(a.getMonth()+1)+"/"+b(a.getDate())+"/"+a.getFullYear()},getCulture:function(){if(this.moment)return e.lang();throw c},getDate:function(){return this.selectedDate?this.selectedDate:new Date(0/0)},getFormat:function(){if(this.moment)return this.momentFormat;throw c},getFormattedDate:function(){return this.selectedDate?this.formatDate(this.selectedDate):b},getRestrictedDates:function(){return this.restricted},inputBlurred:function(){var a,b=this.$input.val();b!==this.inputValue&&(a=this.setDate(b),null===a?this.$element.trigger("inputParsingFailed.fu.datepicker",b):a===!1?this.$element.trigger("inputRestrictedDate.fu.datepicker",a):this.$element.trigger("changed.fu.datepicker",a)),this.preventBlurHide||this.$element.find(".input-group-btn").removeClass("open")},inputFocused:function(){this.$element.find(".input-group-btn").addClass("open")},isInvalidDate:function(a){var c=a.toString();return c===b||"NaN"===c?!0:!1},isRestricted:function(a,b,c){var d,e,f,g,h=this.restrictedParsed;if(this.sameYearOnly&&null!==this.yearRestriction&&c!==this.yearRestriction)return!0;for(d=0,f=h.length;f>d;d++)if(e=h[d].from,g=h[d].to,(c>e.year||c===e.year&&b>e.month||c===e.year&&b===e.month&&a>=e.date)&&(c<g.year||c===g.year&&b<g.month||c===g.year&&b===g.month&&a<=g.date))return!0;return!1},monthClicked:function(b){this.$wheelsMonth.find(".selected").removeClass("selected"),a(b.currentTarget).parent().addClass("selected")},next:function(){var a=this.$headerTitle.attr("data-month"),b=this.$headerTitle.attr("data-year");if(a++,a>11){if(this.sameYearOnly)return;a=0,b++}this.renderMonth(new Date(b,a,1))},onYearScroll:function(b){if(!this.artificialScrolling){var c,d,e=a(b.currentTarget),f="border-box"===e.css("box-sizing")?e.outerHeight():e.height(),g=e.get(0).scrollHeight,h=e.scrollTop(),i=f/(g-h)*100,j=h/g*100;if(5>j){for(d=parseInt(e.find("li:first").attr("data-year"),10),c=d-1;c>d-11;c--)e.prepend('<li data-year="'+c+'"><button type="button">'+c+"</button></li>");this.artificialScrolling=!0,e.scrollTop(e.get(0).scrollHeight-g+h),this.artificialScrolling=!1}else if(i>90)for(d=parseInt(e.find("li:last").attr("data-year"),10),c=d+1;d+11>c;c++)e.append('<li data-year="'+c+'"><button type="button">'+c+"</button></li>")}},parseDate:function(a){var b,c,d,f,g,h,i=this;if(a)if(this.moment){if(d=function(a,b){return b="b"===a?e(b,i.momentFormat):e(b),b.isValid()===!0?b.toDate():new Date(0/0)},h="string"==typeof a?["b","a"]:["a","b"],b=d(h[0],a),!this.isInvalidDate(b))return b;if(b=d(h[1],a),!this.isInvalidDate(b))return b}else if("string"==typeof a){if(b=new Date(Date.parse(a)),!this.isInvalidDate(b))return b;if(a=a.split("T")[0],c=/^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,g=c.exec(a),g&&(f=parseInt(g[2],10),b=new Date(g[1],f-1,g[3]),f===b.getMonth()+1))return b}else if(b=new Date(a),!this.isInvalidDate(b))return b;return new Date(0/0)},prev:function(){var a=this.$headerTitle.attr("data-month"),b=this.$headerTitle.attr("data-year");if(a--,0>a){if(this.sameYearOnly)return;a=11,b--}this.renderMonth(new Date(b,a,1))},renderMonth:function(b){b=b||new Date;var c,d,e,f,g,h,i,j,k,l=new Date(b.getFullYear(),b.getMonth(),1).getDay(),m=new Date(b.getFullYear(),b.getMonth()+1,0).getDate(),n=new Date(b.getFullYear(),b.getMonth(),0).getDate(),o=this.$headerTitle.find(".month"),p=b.getMonth(),q=new Date,r=q.getDate(),s=q.getMonth(),t=q.getFullYear(),u=this.selectedDate,v=this.$days.find("tbody"),w=b.getFullYear();for(u&&(u={date:u.getDate(),month:u.getMonth(),year:u.getFullYear()}),o.find(".current").removeClass("current"),o.find('span[data-month="'+p+'"]').addClass("current"),this.$headerTitle.find(".year").text(w),this.$headerTitle.attr({"data-month":p,"data-year":w}),v.empty(),0!==l?(c=n-l+1,i=-1):(c=1,i=0),h=35-l>=m?5:6,f=0;h>f;f++){for(k=a("<tr></tr>"),g=0;7>g;g++)j=a('<td><span><button type="button" class="datepicker-date">'+c+"</button></span></td>"),-1===i?j.addClass("last-month"):1===i&&j.addClass("next-month"),d=p+i,e=w,0>d?(d=11,e--):d>11&&(d=0,e++),j.attr({"data-date":c,"data-month":d,"data-year":e}),e===t&&d===s&&c===r?j.addClass("current-day"):(t>e||e===t&&s>d||e===t&&d===s&&r>c)&&(j.addClass("past"),this.options.allowPastDates||j.addClass("restricted").attr("title",this.restrictedText)),this.isRestricted(c,d,e)&&j.addClass("restricted").attr("title",this.restrictedText),u&&e===u.year&&d===u.month&&c===u.date&&j.addClass("selected"),c++,-1===i&&c>n?(c=1,i=0):0===i&&c>m&&(c=1,i=1),k.append(j);v.append(k)}},renderWheel:function(a){var b,c,d,e=a.getMonth(),f=this.$wheelsMonth.find("ul"),g=a.getFullYear(),h=this.$wheelsYear.find("ul");for(this.sameYearOnly?(this.$wheelsMonth.addClass("full"),this.$wheelsYear.addClass("hide")):(this.$wheelsMonth.removeClass("full"),this.$wheelsYear.removeClass("hide")),f.find(".selected").removeClass("selected"),c=f.find('li[data-month="'+e+'"]'),c.addClass("selected"),f.scrollTop(f.scrollTop()+(c.position().top-f.outerHeight()/2-c.outerHeight(!0)/2)),h.empty(),b=g-10;g+11>b;b++)h.append('<li data-year="'+b+'"><button type="button">'+b+"</button></li>");d=h.find('li[data-year="'+g+'"]'),d.addClass("selected"),this.artificialScrolling=!0,h.scrollTop(h.scrollTop()+(d.position().top-h.outerHeight()/2-d.outerHeight(!0)/2)),this.artificialScrolling=!1,c.find("button").focus()},selectClicked:function(){var a=this.$wheelsMonth.find(".selected").attr("data-month"),b=this.$wheelsYear.find(".selected").attr("data-year");this.changeView("calendar",new Date(b,a,1))},setCulture:function(a){if(!a)return!1;if(!this.moment)throw c;e.lang(a)},setDate:function(a){var b=this.parseDate(a);return this.isInvalidDate(b)?(this.selectedDate=null,this.renderMonth()):this.isRestricted(b.getDate(),b.getMonth(),b.getFullYear())?(this.selectedDate=!1,this.renderMonth()):(this.selectedDate=b,this.renderMonth(b),this.$input.val(this.formatDate(b))),this.inputValue=this.$input.val(),this.selectedDate},setFormat:function(a){if(!a)return!1;if(!this.moment)throw c;this.momentFormat=a},setRestrictedDates:function(a){var b,c,d=[],e=this,f=function(a){return a===-1/0?{date:-1/0,month:-1/0,year:-1/0}:1/0===a?{date:1/0,month:1/0,year:1/0}:(a=e.parseDate(a),{date:a.getDate(),month:a.getMonth(),year:a.getFullYear()})};for(this.restricted=a,b=0,c=a.length;c>b;b++)d.push({from:f(a[b].from),to:f(a[b].to)});this.restrictedParsed=d},titleClicked:function(){this.changeView("wheels",new Date(this.$headerTitle.attr("data-year"),this.$headerTitle.attr("data-month"),1))},todayClicked:function(){var a=new Date;(a.getMonth()+""!==this.$headerTitle.attr("data-month")||a.getFullYear()+""!==this.$headerTitle.attr("data-year"))&&this.renderMonth(a)},yearClicked:function(b){this.$wheelsYear.find(".selected").removeClass("selected"),a(b.currentTarget).parent().addClass("selected")}},a.fn.datepicker=function(b){var c,d=Array.prototype.slice.call(arguments,1),e=this.each(function(){var e=a(this),f=e.data("fu.datepicker"),g="object"==typeof b&&b;f||e.data("fu.datepicker",f=new i(this,g)),"string"==typeof b&&(c=f[b].apply(f,d))});return void 0===c?e:c},a.fn.datepicker.defaults={allowPastDates:!1,date:new Date,formatDate:null,momentConfig:{culture:"en",format:"L"},parseDate:null,restricted:[],restrictedText:"Restricted",sameYearOnly:!1},a.fn.datepicker.Constructor=i,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=f,this},a(document).on("mousedown.fu.datepicker.data-api","[data-initialize=datepicker]",function(b){var c=a(b.target).closest(".datepicker");c.data("datepicker")||c.datepicker(c.data())}),a(document).on("click.fu.datepicker.data-api",".datepicker .dropdown-menu",function(b){var c=a(b.target);(!c.is(".datepicker-date")||c.closest(".restricted").length)&&b.stopPropagation()}),a(document).on("click.fu.datepicker.data-api",".datepicker input",function(a){a.stopPropagation()}),a(function(){a("[data-initialize=datepicker]").each(function(){var b=a(this);b.data("datepicker")||b.datepicker(b.data())})})}(a),function(a){function b(b){a(b).css({visibility:"hidden"}),c(b)?b.parent().addClass("dropup"):b.parent().removeClass("dropup"),a(b).css({visibility:"visible"})}function c(a){var b=d(a),c={};return c.parentHeight=a.parent().outerHeight(),c.parentOffsetTop=a.parent().offset().top,c.dropdownHeight=a.outerHeight(),c.containerHeight=b.overflowElement.outerHeight(),c.containerOffsetTop=b.isWindow?b.overflowElement.scrollTop():b.overflowElement.offset().top,c.fromTop=c.parentOffsetTop-c.containerOffsetTop,c.fromBottom=c.containerHeight-c.parentHeight-(c.parentOffsetTop-c.containerOffsetTop),c.dropdownHeight<c.fromBottom?!1:c.dropdownHeight<c.fromTop?!0:c.dropdownHeight>=c.fromTop&&c.dropdownHeight>=c.fromBottom?c.fromTop>=c.fromBottom?!0:!1:void 0}function d(b){var c=window,d=!0;return a.each(b.parents(),function(b,e){return"visible"!==a(e).css("overflow")?(c=e,d=!1,!1):void 0}),{overflowElement:a(c),isWindow:d}}a(document.body).on("click.fu.dropdown-autoflip","[data-toggle=dropdown][data-flip]",function(){"auto"===a(this).data().flip&&b(a(this).next(".dropdown-menu"))}),a(document.body).on("suggested.fu.pillbox",function(c,d){b(a(d)),a(d).parent().addClass("open")}),a.fn.dropdownautoflip=function(){}}(a),function(a){var b=a.fn.loader,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.loader.defaults,c),this.begin=this.$element.is("[data-begin]")?parseInt(this.$element.attr("data-begin"),10):1,this.delay=this.$element.is("[data-delay]")?parseFloat(this.$element.attr("data-delay")):150,this.end=this.$element.is("[data-end]")?parseInt(this.$element.attr("data-end"),10):8,this.frame=this.$element.is("[data-frame]")?parseInt(this.$element.attr("data-frame"),10):this.begin,this.isIElt9=!1,this.timeout={};var d=this.msieVersion();d!==!1&&9>d&&(this.$element.addClass("iefix"),this.isIElt9=!0),this.$element.attr("data-frame",this.frame+""),this.play()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},ieRepaint:function(){this.isIElt9&&this.$element.addClass("iefix_repaint").removeClass("iefix_repaint")},msieVersion:function(){var a=window.navigator.userAgent,b=a.indexOf("MSIE ");return b>0?parseInt(a.substring(b+5,a.indexOf(".",b)),10):!1},next:function(){this.frame++,this.frame>this.end&&(this.frame=this.begin),this.$element.attr("data-frame",this.frame+""),this.ieRepaint()},pause:function(){clearTimeout(this.timeout)},play:function(){var a=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){a.next(),a.play()},this.delay)},previous:function(){this.frame--,this.frame<this.begin&&(this.frame=this.end),this.$element.attr("data-frame",this.frame+""),this.ieRepaint()},reset:function(){this.frame=this.begin,this.$element.attr("data-frame",this.frame+""),this.ieRepaint()}},a.fn.loader=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.loader"),h="object"==typeof b&&b;g||f.data("fu.loader",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.loader.defaults={},a.fn.loader.Constructor=c,a.fn.loader.noConflict=function(){return a.fn.loader=b,this},a(function(){a("[data-initialize=loader]").each(function(){var b=a(this);b.data("fu.loader")||b.loader(b.data())})})}(a),function(a){var b=a.fn.placard,c=function(b,c){var d=this;this.$element=a(b),this.options=a.extend({},a.fn.placard.defaults,c),this.$accept=this.$element.find(".placard-accept"),this.$cancel=this.$element.find(".placard-cancel"),this.$field=this.$element.find(".placard-field"),this.$footer=this.$element.find(".placard-footer"),this.$header=this.$element.find(".placard-header"),this.$popup=this.$element.find(".placard-popup"),this.actualValue=null,this.clickStamp="_",this.previousValue="",-1===this.options.revertOnCancel&&(this.options.revertOnCancel=this.$accept.length>0?!0:!1),this.$field.on("focus.fu.placard",a.proxy(this.show,this)),this.$accept.on("click.fu.placard",a.proxy(this.complete,this,"accept")),this.$cancel.on("click.fu.placard",function(a){a.preventDefault(),d.complete("cancel")}),this.ellipsis()};c.prototype={constructor:c,complete:function(a){var b=this.options["on"+a[0].toUpperCase()+a.substring(1)],c={previousValue:this.previousValue,value:this.$field.val()};b?(b(c),this.$element.trigger(a,c)):("cancel"===a&&this.options.revertOnCancel&&this.$field.val(this.previousValue),this.$element.trigger(a,c),this.hide())},destroy:function(){return this.$element.remove(),a(document).off("click.fu.placard.externalClick."+this.clickStamp),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},disable:function(){this.$element.addClass("disabled"),this.$field.attr("disabled","disabled"),this.hide()},ellipsis:function(){var a,b,c;if("true"===this.$element.attr("data-ellipsis"))if(a=this.$field.get(0),this.$field.is("input"))a.scrollLeft=0;else if(a.scrollTop=0,a.clientHeight<a.scrollHeight){for(this.actualValue=this.$field.val(),this.$field.val(""),c="",b=0;a.clientHeight>=a.scrollHeight;)c+=this.actualValue[b],this.$field.val(c+"..."),b++;c=c.length>0?c.substring(0,c.length-1):"",this.$field.val(c+"...")}},enable:function(){this.$element.removeClass("disabled"),this.$field.removeAttr("disabled")},externalClickListener:function(a,b){(b===!0||this.isExternalClick(a))&&this.complete(this.options.externalClickAction)},getValue:function(){return null!==this.actualValue?this.actualValue:this.$field.val()},hide:function(){this.$element.hasClass("showing")&&(this.$element.removeClass("showing"),this.ellipsis(),a(document).off("click.fu.placard.externalClick."+this.clickStamp),this.$element.trigger("hidden.fu.placard"))},isExternalClick:function(b){var c,d,e=this.$element.get(0),f=this.options.externalClickExceptions||[],g=a(b.target);if(b.target===e||g.parents(".placard:first").get(0)===e)return!1;for(c=0,d=f.length;d>c;c++)if(g.is(f[c])||g.parents(f[c]).length>0)return!1;return!0},setValue:function(a){this.$field.val(a),this.$element.hasClass("showing")||this.ellipsis()},show:function(){var b;if(!this.$element.hasClass("showing")){if(b=a(document).find(".placard.showing"),b.length>0){if(b.data("fu.placard")&&b.data("fu.placard").options.explicit)return;b.placard("externalClickListener",{},!0)}this.previousValue=this.$field.val(),this.$element.addClass("showing"),null!==this.actualValue&&(this.$field.val(this.actualValue),this.actualValue=null),this.$header.length>0&&this.$popup.css("top","-"+this.$header.outerHeight(!0)+"px"),this.$footer.length>0&&this.$popup.css("bottom","-"+this.$footer.outerHeight(!0)+"px"),this.$element.trigger("shown.fu.placard"),this.clickStamp=(new Date).getTime()+(Math.floor(100*Math.random())+1),this.options.explicit||a(document).on("click.fu.placard.externalClick."+this.clickStamp,a.proxy(this.externalClickListener,this))}}},a.fn.placard=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.placard"),h="object"==typeof b&&b;g||f.data("fu.placard",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.placard.defaults={onAccept:void 0,onCancel:void 0,externalClickAction:"cancel",externalClickExceptions:[],explicit:!1,revertOnCancel:-1},a.fn.placard.Constructor=c,a.fn.placard.noConflict=function(){return a.fn.placard=b,this},a(document).on("focus.fu.placard.data-api","[data-initialize=placard]",function(b){var c=a(b.target).closest(".placard");c.data("fu.placard")||c.placard(c.data())}),a(function(){a("[data-initialize=placard]").each(function(){var b=a(this);b.data("fu.placard")||b.placard(b.data())})})}(a),function(a){var b=a.fn.radio,c=function(b,c){this.options=a.extend({},a.fn.radio.defaults,c),this.$radio=a(b).is('input[type="radio"]')?a(b):a(b).find('input[type="radio"]:first'),this.$label=this.$radio.parent(),this.groupName=this.$radio.attr("name"),this.$parent=this.$label.parent(".radio"),this.$toggleContainer=null,0===this.$parent.length&&(this.$parent=null);var d=this.$radio.attr("data-toggle");d&&(this.$toggleContainer=a(d)),this.setState(this.$radio),this.$radio.on("change.fu.radio",a.proxy(this.itemchecked,this))};c.prototype={constructor:c,destroy:function(){return this.$parent.remove(),this.$parent[0].outerHTML},setState:function(a){a=a||this.$radio;var b=a.is(":checked"),c=!!a.prop("disabled");this.$label.removeClass("checked"),this.$parent&&this.$parent.removeClass("checked disabled"),b===!0&&(this.$label.addClass("checked"),this.$parent&&this.$parent.addClass("checked")),c===!0&&(this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")),this.toggleContainer()},resetGroup:function(){var b=a('input[name="'+this.groupName+'"]');b.each(function(){var b=a(this).parent("label");b.removeClass("checked"),b.parent(".radio").removeClass("checked")})},enable:function(){this.$radio.attr("disabled",!1),this.$label.removeClass("disabled"),this.$parent&&this.$parent.removeClass("disabled")},disable:function(){this.$radio.attr("disabled",!0),this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")},itemchecked:function(b){var c=a(b.target);this.resetGroup(),this.setState(c)},check:function(){this.resetGroup(),this.$radio.prop("checked",!0),this.setState(this.$radio)},toggleContainer:function(){var b;this.$toggleContainer&&(this.isChecked()?(b=a('input[name="'+this.groupName+'"]'),b.each(function(){var b=a(this).attr("data-toggle");a(b).addClass("hide"),a(b).attr("aria-hidden","true")}),this.$toggleContainer.removeClass("hide"),this.$toggleContainer.attr("aria-hidden","false")):(this.$toggleContainer.addClass("hide"),this.$toggleContainer.attr("aria-hidden","true")))},uncheck:function(){this.$radio.prop("checked",!1),this.setState(this.$radio)},isChecked:function(){return this.$radio.is(":checked")}},a.fn.radio=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.radio"),h="object"==typeof b&&b;g||f.data("fu.radio",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.radio.defaults={},a.fn.radio.Constructor=c,a.fn.radio.noConflict=function(){return a.fn.radio=b,this},a(document).on("mouseover.fu.checkbox.data-api","[data-initialize=radio]",function(b){var c=a(b.target).closest(".radio").find("[type=radio]");c.data("fu.radio")||c.radio(c.data())}),a(function(){a("[data-initialize=radio] [type=radio]").each(function(){var b=a(this);b.data("fu.radio")||b.radio(b.data())})})}(a),function(a){var b=a.fn.search,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.search.defaults,c),this.$button=this.$element.find("button"),this.$input=this.$element.find("input"),this.$icon=this.$element.find(".glyphicon"),this.$button.on("click.fu.search",a.proxy(this.buttonclicked,this)),this.$input.on("keydown.fu.search",a.proxy(this.keypress,this)),this.$input.on("keyup.fu.search",a.proxy(this.keypressed,this)),this.activeSearch=""};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},search:function(a){this.$icon.hasClass("glyphicon")&&this.$icon.removeClass("glyphicon-search").addClass("glyphicon-remove"),this.activeSearch=a,this.$element.addClass("searched"),this.$element.trigger("searched.fu.search",a)},clear:function(){this.$icon.hasClass("glyphicon")&&this.$icon.removeClass("glyphicon-remove").addClass("glyphicon-search"),this.activeSearch="",this.$input.val(""),this.$element.removeClass("searched"),this.$element.trigger("cleared.fu.search")},action:function(){var a=this.$input.val(),b=""===a||a===this.activeSearch;this.activeSearch&&b?this.clear():a&&this.search(a)},buttonclicked:function(b){b.preventDefault(),a(b.currentTarget).is(".disabled, :disabled")||this.action()},keypress:function(a){13===a.which&&a.preventDefault()},keypressed:function(a){var b,c;13===a.which?(a.preventDefault(),this.action()):(b=this.$input.val(),c=b&&b===this.activeSearch,this.$icon.attr("class",c?"glyphicon glyphicon-remove":"glyphicon glyphicon-search"))},disable:function(){this.$element.addClass("disabled"),this.$input.attr("disabled","disabled"),this.$button.addClass("disabled")},enable:function(){this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$button.removeClass("disabled")}},a.fn.search=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.search"),h="object"==typeof b&&b;g||f.data("fu.search",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.search.defaults={},a.fn.search.Constructor=c,a.fn.search.noConflict=function(){return a.fn.search=b,this},a(document).on("mousedown.fu.search.data-api","[data-initialize=search]",function(b){var c=a(b.target).closest(".search"); -c.data("fu.search")||c.search(c.data())}),a(function(){a("[data-initialize=search]").each(function(){var b=a(this);b.data("fu.search")||b.search(b.data())})})}(a),function(a){var b=a.fn.selectlist,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.selectlist.defaults,c),this.$button=this.$element.find(".btn.dropdown-toggle"),this.$hiddenField=this.$element.find(".hidden-field"),this.$label=this.$element.find(".selected-label"),this.$element.on("click.fu.selectlist",".dropdown-menu a",a.proxy(this.itemClicked,this)),this.setDefaultSelection(),"auto"===c.resize&&this.resize()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},doSelect:function(b){var c;this.$selectedItem=c=b,this.$hiddenField.val(this.$selectedItem.attr("data-value")),this.$label.html(a(this.$selectedItem.children()[0]).html()),this.$element.find("li").each(function(){c.is(a(this))?a(this).attr("data-selected",!0):a(this).removeData("selected").removeAttr("data-selected")})},itemClicked:function(b){this.$element.trigger("clicked.fu.selectlist",this.$selectedItem),b.preventDefault(),a(b.target).parent().is(this.$selectedItem)||this.itemChanged(b),this.$element.find(".dropdown-toggle").focus()},itemChanged:function(b){this.doSelect(a(b.target).parent());var c=this.selectedItem();this.$element.trigger("changed.fu.selectlist",c)},resize:function(){var b=0,c=a("<div/>").addClass("selectlist-sizer"),d=0;Boolean(a(document).find("html").hasClass("fuelux"))?a(document.body).append(c):a(".fuelux:first").append(c),this.$element.find("a").each(function(){c.text(a(this).text()),b=c.outerWidth(),b>d&&(d=b)}),c.remove(),this.$label.width(d)},selectedItem:function(){var b=this.$selectedItem.text();return a.extend({text:b},this.$selectedItem.data())},selectByText:function(b){var c=a([]);this.$element.find("li").each(function(){return(this.textContent||this.innerText||a(this).text()||"").toLowerCase()===(b||"").toLowerCase()?(c=a(this),!1):void 0}),this.doSelect(c)},selectByValue:function(a){var b='li[data-value="'+a+'"]';this.selectBySelector(b)},selectByIndex:function(a){var b="li:eq("+a+")";this.selectBySelector(b)},selectBySelector:function(a){var b=this.$element.find(a);this.doSelect(b)},setDefaultSelection:function(){var a=this.$element.find("li[data-selected=true]").eq(0);0===a.length&&(a=this.$element.find("li").has("a").eq(0)),this.doSelect(a)},enable:function(){this.$element.removeClass("disabled"),this.$button.removeClass("disabled")},disable:function(){this.$element.addClass("disabled"),this.$button.addClass("disabled")}},a.fn.selectlist=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.selectlist"),h="object"==typeof b&&b;g||f.data("fu.selectlist",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.selectlist.defaults={},a.fn.selectlist.Constructor=c,a.fn.selectlist.noConflict=function(){return a.fn.selectlist=b,this},a(document).on("mousedown.fu.selectlist.data-api","[data-initialize=selectlist]",function(b){var c=a(b.target).closest(".selectlist");c.data("fu.selectlist")||c.selectlist(c.data())}),a(function(){a("[data-initialize=selectlist]").each(function(){var b=a(this);b.data("fu.selectlist")||b.selectlist(b.data())})})}(a),function(a){var b=a.fn.spinbox,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.spinbox.defaults,c),this.$input=this.$element.find(".spinbox-input"),this.$element.on("focusin.fu.spinbox",this.$input,a.proxy(this.changeFlag,this)),this.$element.on("focusout.fu.spinbox",this.$input,a.proxy(this.change,this)),this.$element.on("keydown.fu.spinbox",this.$input,a.proxy(this.keydown,this)),this.$element.on("keyup.fu.spinbox",this.$input,a.proxy(this.keyup,this)),this.bindMousewheelListeners(),this.mousewheelTimeout={},this.options.hold?(this.$element.on("mousedown.fu.spinbox",".spinbox-up",a.proxy(function(){this.startSpin(!0)},this)),this.$element.on("mouseup.fu.spinbox",".spinbox-up, .spinbox-down",a.proxy(this.stopSpin,this)),this.$element.on("mouseout.fu.spinbox",".spinbox-up, .spinbox-down",a.proxy(this.stopSpin,this)),this.$element.on("mousedown.fu.spinbox",".spinbox-down",a.proxy(function(){this.startSpin(!1)},this))):(this.$element.on("click.fu.spinbox",".spinbox-up",a.proxy(function(){this.step(!0)},this)),this.$element.on("click.fu.spinbox",".spinbox-down",a.proxy(function(){this.step(!1)},this))),this.switches={count:1,enabled:!0},this.switches.speed="medium"===this.options.speed?300:"fast"===this.options.speed?100:500,this.lastValue=this.options.value,this.render(),this.options.disabled&&this.disable()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},render:function(){var b=this.parseInput(this.$input.val()),c="";""!==b&&0===this.options.value?this.value(b):this.output(this.options.value),this.options.units.length&&a.each(this.options.units,function(a,b){b.length>c.length&&(c=b)})},output:function(a,b){return a=(a+"").split(".").join(this.options.decimalMark),b=b||!0,b&&this.$input.val(a),a},parseInput:function(a){return a=(a+"").split(this.options.decimalMark).join(".")},change:function(){var a=this.parseInput(this.$input.val())||"";this.options.units.length||"."!==this.options.decimalMark?a=this.parseValueWithUnit(a):a/1?a=this.options.value=this.checkMaxMin(a/1):(a=this.checkMaxMin(a.replace(/[^0-9.-]/g,"")||""),this.options.value=a/1),this.output(a),this.changeFlag=!1,this.triggerChangedEvent()},changeFlag:function(){this.changeFlag=!0},stopSpin:function(){void 0!==this.switches.timeout&&(clearTimeout(this.switches.timeout),this.switches.count=1,this.triggerChangedEvent())},triggerChangedEvent:function(){var a=this.value();a!==this.lastValue&&(this.lastValue=a,this.$element.trigger("changed.fu.spinbox",this.output(a,!1)))},startSpin:function(b){if(!this.options.disabled){var c=this.switches.count;1===c?(this.step(b),c=1):c=3>c?1.5:8>c?2.5:4,this.switches.timeout=setTimeout(a.proxy(function(){this.iterate(b)},this),this.switches.speed/c),this.switches.count++}},iterate:function(a){this.step(a),this.startSpin(a)},step:function(a){var b,c,d,e;if(this.changeFlag&&this.change(),d=this.options.value,e=a?this.options.max:this.options.min,a?e>d:d>e){var f=d+(a?1:-1)*this.options.step;this.options.step%1!==0&&(b=(this.options.step+"").split(".")[1].length,c=Math.pow(10,b),f=Math.round(f*c)/c),this.value((a?f>e:e>f)?e:f)}else if(this.options.cycle){var g=a?this.options.min:this.options.max;this.value(g)}},value:function(a){return a||0===a?this.options.units.length||"."!==this.options.decimalMark?(this.output(this.parseValueWithUnit(a+(this.unit||""))),this):!isNaN(parseFloat(a))&&isFinite(a)?(this.options.value=a/1,this.output(a+(this.unit?this.unit:"")),this):void 0:(this.changeFlag&&this.change(),this.unit?this.options.value+this.unit:this.output(this.options.value,!1))},isUnitLegal:function(b){var c;return a.each(this.options.units,function(a,d){return d.toLowerCase()===b.toLowerCase()?(c=b.toLowerCase(),!1):void 0}),c},parseValueWithUnit:function(a){var b=a.replace(/[^a-zA-Z]/g,""),c=a.replace(/[^0-9.-]/g,"");return b&&(b=this.isUnitLegal(b)),this.options.value=this.checkMaxMin(c/1),this.unit=b||void 0,this.options.value+(b||"")},checkMaxMin:function(a){return isNaN(parseFloat(a))?a:(a<=this.options.max&&a>=this.options.min||(a=a>=this.options.max?this.options.max:this.options.min),a)},disable:function(){this.options.disabled=!0,this.$element.addClass("disabled"),this.$input.attr("disabled",""),this.$element.find("button").addClass("disabled")},enable:function(){this.options.disabled=!1,this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$element.find("button").removeClass("disabled")},keydown:function(a){var b=a.keyCode;38===b?this.step(!0):40===b&&this.step(!1)},keyup:function(a){var b=a.keyCode;(38===b||40===b)&&this.triggerChangedEvent()},bindMousewheelListeners:function(){var b=this.$input.get(0);b.addEventListener?(b.addEventListener("mousewheel",a.proxy(this.mousewheelHandler,this),!1),b.addEventListener("DOMMouseScroll",a.proxy(this.mousewheelHandler,this),!1)):b.attachEvent("onmousewheel",a.proxy(this.mousewheelHandler,this))},mousewheelHandler:function(a){var b=window.event||a,c=Math.max(-1,Math.min(1,b.wheelDelta||-b.detail)),d=this;return clearTimeout(this.mousewheelTimeout),this.mousewheelTimeout=setTimeout(function(){d.triggerChangedEvent()},300),this.step(0>c?!0:!1),b.preventDefault?b.preventDefault():b.returnValue=!1,!1}},a.fn.spinbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.spinbox"),h="object"==typeof b&&b;g||f.data("fu.spinbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.spinbox.defaults={value:0,min:0,max:999,step:1,hold:!0,speed:"medium",disabled:!1,cycle:!1,units:[],decimalMark:"."},a.fn.spinbox.Constructor=c,a.fn.spinbox.noConflict=function(){return a.fn.spinbox=b,this},a(document).on("mousedown.fu.spinbox.data-api","[data-initialize=spinbox]",function(b){var c=a(b.target).closest(".spinbox");c.data("fu.spinbox")||c.spinbox(c.data())}),a(function(){a("[data-initialize=spinbox]").each(function(){var b=a(this);b.data("fu.spinbox")||b.spinbox(b.data())})})}(a),function(a){var b=a.fn.tree,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.tree.defaults,c),this.$element.on("click.fu.tree",".tree-item",a.proxy(function(a){this.selectItem(a.currentTarget)},this)),this.$element.on("click.fu.tree",".tree-branch-name",a.proxy(function(a){this.openFolder(a.currentTarget)},this)),this.options.folderSelect&&(this.$element.off("click.fu.tree",".tree-branch-name"),this.$element.on("click.fu.tree",".icon-caret",a.proxy(function(b){this.openFolder(a(b.currentTarget).parent())},this)),this.$element.on("click.fu.tree",".tree-branch-name",a.proxy(function(b){this.selectFolder(a(b.currentTarget))},this))),this.render()};c.prototype={constructor:c,destroy:function(){return this.$element.find("li:not([data-template])").remove(),this.$element.remove(),this.$element[0].outerHTML},render:function(){this.populate(this.$element)},populate:function(b){var c=this,d=b.hasClass("tree")?b:b.parent(),e=d.find(".tree-loader:eq(0)");e.removeClass("hide"),this.options.dataSource(this.options.folderSelect?d.data():b.data(),function(f){e.addClass("hide"),a.each(f.data,function(e,f){var g;"folder"===f.type?(g=c.$element.find("[data-template=treebranch]:eq(0)").clone().removeClass("hide").removeAttr("data-template"),g.data(f),g.find(".tree-branch-name > .tree-label").html(f.name)):"item"===f.type&&(g=c.$element.find("[data-template=treeitem]:eq(0)").clone().removeClass("hide").removeAttr("data-template"),g.find(".tree-item-name > .tree-label").html(f.name),g.data(f));var h=f.dataAttributes||[];a.each(h,function(a,b){switch(a){case"class":case"classes":case"className":g.addClass(b);break;case"data-icon":g.find(".icon-item").removeClass().addClass("icon-item "+b),g.attr(a,b);break;case"id":g.attr(a,b),g.attr("aria-labelledby",b+"-label"),g.find(".tree-branch-name > .tree-label").attr("id",b+"-label");break;default:g.attr(a,b)}}),b.hasClass("tree-branch-header")?d.find(".tree-branch-children:eq(0)").append(g):b.append(g)}),c.$element.trigger("loaded.fu.tree",d)})},selectItem:function(b){var c=a(b),d=this.$element.find(".tree-selected"),e=[],f=c.find(".icon-item");this.options.multiSelect?a.each(d,function(b,d){var f=a(d);f[0]!==c[0]&&e.push(a(d).data())}):d[0]!==c[0]&&(d.removeClass("tree-selected").find(".glyphicon").removeClass("glyphicon-ok").addClass("fueluxicon-bullet"),e.push(c.data()));var g="selected";c.hasClass("tree-selected")?(g="unselected",c.removeClass("tree-selected"),(f.hasClass("glyphicon-ok")||f.hasClass("fueluxicon-bullet"))&&f.removeClass("glyphicon-ok").addClass("fueluxicon-bullet")):(c.addClass("tree-selected"),(f.hasClass("glyphicon-ok")||f.hasClass("fueluxicon-bullet"))&&f.removeClass("fueluxicon-bullet").addClass("glyphicon-ok"),this.options.multiSelect&&e.push(c.data())),e.length&&this.$element.trigger("selected",{selected:e}),c.trigger("updated.fu.tree",{selected:e,item:c,eventType:g})},openFolder:function(b){var c,d,e,f=a(b);this.options.folderSelect||(f=a(b).parent()),c=f.closest(".tree-branch"),d=c.find(".tree-branch-children"),e=d.eq(0);var g,h,i;f.find(".glyphicon-folder-close").length?(g="opened",h=".glyphicon-folder-close",i="glyphicon-folder-open",c.addClass("tree-open"),c.attr("aria-expanded","true"),e.removeClass("hide"),d.children().length||this.populate(d)):f.find(".glyphicon-folder-open")&&(g="closed",h=".glyphicon-folder-open",i="glyphicon-folder-close",c.removeClass("tree-open"),c.attr("aria-expanded","false"),e.addClass("hide"),this.options.cacheItems||e.empty()),c.find("> .tree-branch-header .icon-folder").eq(0).removeClass("glyphicon-folder-close glyphicon-folder-open").addClass(i),this.$element.trigger(g,c.data())},selectFolder:function(b){var c=a(b),d=c.closest(".tree-branch"),e=this.$element.find(".tree-branch.tree-selected"),f=[],g="selected";d.hasClass("tree-selected")?(g="unselected",d.removeClass("tree-selected")):d.addClass("tree-selected"),this.options.multiSelect?(e=this.$element.find(".tree-branch.tree-selected"),a.each(e,function(b,d){var e=a(d);e[0]!==c[0]&&f.push(a(d).data())})):e[0]!==c[0]&&(e.removeClass("tree-selected"),f.push(d.data())),f.length&&this.$element.trigger("selected.fu.tree",{selected:f}),c.trigger("updated.fu.tree",{selected:f,item:c,eventType:g})},selectedItems:function(){var b=this.$element.find(".tree-selected"),c=[];return a.each(b,function(b,d){c.push(a(d).data())}),c},collapse:function(){var b=this.options.cacheItems;this.$element.find(".icon-folder-open").each(function(){var c=a(this).removeClass("icon-folder-close icon-folder-open").addClass("icon-folder-close"),d=c.parent().parent(),e=d.children(".tree-branch-children");e.addClass("hide"),b||e.empty()})}},a.fn.tree=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.tree"),h="object"==typeof b&&b;g||f.data("fu.tree",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.tree.defaults={dataSource:function(){},multiSelect:!1,cacheItems:!0,folderSelect:!0},a.fn.tree.Constructor=c,a.fn.tree.noConflict=function(){return a.fn.tree=b,this}}(a),function(a){var b=a.fn.wizard,c=function(b,c){var d;this.$element=a(b),this.options=a.extend({},a.fn.wizard.defaults,c),this.options.disablePreviousStep="previous"===this.$element.attr("data-restrict")?!0:this.options.disablePreviousStep,this.currentStep=this.options.selectedItem.step,this.numSteps=this.$element.find(".steps li").length,this.$prevBtn=this.$element.find("button.btn-prev"),this.$nextBtn=this.$element.find("button.btn-next"),d=this.$nextBtn.children().detach(),this.nextText=a.trim(this.$nextBtn.text()),this.$nextBtn.append(d),this.$prevBtn.on("click.fu.wizard",a.proxy(this.previous,this)),this.$nextBtn.on("click.fu.wizard",a.proxy(this.next,this)),this.$element.on("click.fu.wizard","li.complete",a.proxy(this.stepclicked,this)),this.selectedItem(this.options.selectedItem),this.options.disablePreviousStep&&(this.$prevBtn.attr("disabled",!0),this.$element.find(".steps").addClass("previous-disabled"))};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},addSteps:function(b){var c,d,e,f,g,h,i=[].slice.call(arguments).slice(1),j=this.$element.find(".steps"),k=this.$element.find(".step-content");for(b=-1===b||b>this.numSteps+1?this.numSteps+1:b,i[0]instanceof Array&&(i=i[0]),g=j.find("li:nth-child("+b+")"),f=k.find(".step-pane:nth-child("+b+")"),g.length<1&&(g=null),c=0,d=i.length;d>c;c++)h=a('<li data-step="'+b+'"><span class="badge badge-info"></span></li>'),h.append(i[c].label||"").append('<span class="chevron"></span>'),h.find(".badge").append(i[c].badge||b),e=a('<div class="step-pane" data-step="'+b+'"></div>'),e.append(i[c].pane||""),g?(g.before(h),f.before(e)):(j.append(h),k.append(e)),b++;this.syncSteps(),this.numSteps=j.find("li").length,this.setState()},removeSteps:function(b,c){var d,e="nextAll",f=0,g=this.$element.find(".steps"),h=this.$element.find(".step-content");c=void 0!==c?c:1,b>g.find("li").length?d=g.find("li:last"):(d=g.find("li:nth-child("+b+")").prev(),d.length<1&&(e="children",d=g)),d[e]().each(function(){var b=a(this),d=b.attr("data-step");return c>f?(b.remove(),h.find('.step-pane[data-step="'+d+'"]:first').remove(),void f++):!1}),this.syncSteps(),this.numSteps=g.find("li").length,this.setState()},setState:function(){var b=this.currentStep>1,c=1===this.currentStep,d=this.currentStep===this.numSteps;this.options.disablePreviousStep||this.$prevBtn.attr("disabled",c===!0||b===!1);var e=this.$nextBtn.attr("data-last");if(e){this.lastText=e;var f=this.nextText;d===!0?(f=this.lastText,this.$element.addClass("complete")):this.$element.removeClass("complete");var g=this.$nextBtn.children().detach();this.$nextBtn.text(f).append(g)}var h=this.$element.find(".steps li");h.removeClass("active").removeClass("complete"),h.find("span.badge").removeClass("badge-info").removeClass("badge-success");var i=".steps li:lt("+(this.currentStep-1)+")",j=this.$element.find(i);j.addClass("complete"),j.find("span.badge").addClass("badge-success");var k=".steps li:eq("+(this.currentStep-1)+")",l=this.$element.find(k);l.addClass("active"),l.find("span.badge").addClass("badge-info");var m=this.$element.find(".step-content"),n=l.attr("data-step");m.find(".step-pane").removeClass("active"),m.find('.step-pane[data-step="'+n+'"]:first').addClass("active"),this.$element.find(".steps").first().attr("style","margin-left: 0");var o=0;this.$element.find(".steps > li").each(function(){o+=a(this).outerWidth()});var p=0;if(p=this.$element.find(".actions").length?this.$element.width()-this.$element.find(".actions").first().outerWidth():this.$element.width(),o>p){var q=o-p;this.$element.find(".steps").first().attr("style","margin-left: -"+q+"px"),this.$element.find("li.active").first().position().left<200&&(q+=this.$element.find("li.active").first().position().left-200,1>q?this.$element.find(".steps").first().attr("style","margin-left: 0"):this.$element.find(".steps").first().attr("style","margin-left: -"+q+"px"))}if("undefined"!=typeof this.initialized){var r=a.Event("changed.fu.wizard");this.$element.trigger(r,{step:this.currentStep})}this.initialized=!0},stepclicked:function(b){var c=a(b.currentTarget),d=this.$element.find(".steps li").index(c),e=!0;if(this.options.disablePreviousStep&&d<this.currentStep&&(e=!1),e){var f=a.Event("stepclicked.fu.wizard");if(this.$element.trigger(f,{step:d+1}),f.isDefaultPrevented())return;this.currentStep=d+1,this.setState()}},syncSteps:function(){var b=1,c=this.$element.find(".steps"),d=this.$element.find(".step-content");c.children().each(function(){var c=a(this),e=c.find(".badge"),f=c.attr("data-step");isNaN(parseInt(e.html(),10))||e.html(b),c.attr("data-step",b),d.find('.step-pane[data-step="'+f+'"]:last').attr("data-step",b),b++})},previous:function(){var b=this.currentStep>1;if(this.options.disablePreviousStep&&(b=!1),b){var c=a.Event("actionclicked.fu.wizard");if(this.$element.trigger(c,{step:this.currentStep,direction:"previous"}),c.isDefaultPrevented())return;this.currentStep-=1,this.setState()}this.$prevBtn.is(":disabled")?this.$nextBtn.focus():this.$prevBtn.focus()},next:function(){var b=this.currentStep+1<=this.numSteps,c=this.currentStep===this.numSteps;if(b){var d=a.Event("actionclicked.fu.wizard");if(this.$element.trigger(d,{step:this.currentStep,direction:"next"}),d.isDefaultPrevented())return;this.currentStep+=1,this.setState()}else c&&this.$element.trigger("finished.fu.wizard");this.$nextBtn.is(":disabled")?this.$prevBtn.focus():this.$nextBtn.focus()},selectedItem:function(a){var b,c;return a?(c=a.step||-1,c>=1&&c<=this.numSteps?(this.currentStep=c,this.setState()):(c=this.$element.find(".steps li.active:first").attr("data-step"),isNaN(c)||(this.currentStep=parseInt(c,10),this.setState())),b=this):b={step:this.currentStep},b}},a.fn.wizard=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.wizard"),h="object"==typeof b&&b;g||f.data("fu.wizard",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.wizard.defaults={disablePreviousStep:!1,selectedItem:{step:-1}},a.fn.wizard.Constructor=c,a.fn.wizard.noConflict=function(){return a.fn.wizard=b,this},a(document).on("mouseover.fu.wizard.data-api","[data-initialize=wizard]",function(b){var c=a(b.target).closest(".wizard");c.data("fu.wizard")||c.wizard(c.data())}),a(function(){a("[data-initialize=wizard]").each(function(){var b=a(this);b.data("fu.wizard")||b.wizard(b.data())})})}(a),function(a){var b=a.fn.infinitescroll,c=function(b,c){this.$element=a(b),this.$element.addClass("infinitescroll"),this.options=a.extend({},a.fn.infinitescroll.defaults,c),this.curScrollTop=this.$element.scrollTop(),this.curPercentage=this.getPercentage(),this.fetchingData=!1,this.$element.on("scroll.fu.infinitescroll",a.proxy(this.onScroll,this)),this.onScroll()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.empty(),this.$element[0].outerHTML},disable:function(){this.$element.off("scroll.fu.infinitescroll")},enable:function(){this.$element.on("scroll.fu.infinitescroll",a.proxy(this.onScroll,this))},end:function(b){var c=a('<div class="infinitescroll-end"></div>');c.append(b?b:"---------"),this.$element.append(c),this.disable()},getPercentage:function(){var a="border-box"===this.$element.css("box-sizing")?this.$element.outerHeight():this.$element.height(),b=this.$element.get(0).scrollHeight;return b>a?a/(b-this.curScrollTop)*100:0},fetchData:function(b){var c,d=a('<div class="infinitescroll-load"></div>'),e=this,f=function(){var b={percentage:e.curPercentage,scrollTop:e.curScrollTop},c=a('<div class="loader"></div>');d.append(c),c.loader(),e.options.dataSource&&e.options.dataSource(b,function(a){var b;d.remove(),a.content&&e.$element.append(a.content),a.end&&(b=a.end!==!0?a.end:void 0,e.end(b)),e.fetchingData=!1})};this.fetchingData=!0,this.$element.append(d),this.options.hybrid&&b!==!0?(c=a('<button type="button" class="btn btn-primary"></button>'),c.append("object"==typeof this.options.hybrid?this.options.hybrid.label:'<span class="glyphicon glyphicon-repeat"></span>'),c.on("click.fu.infinitescroll",function(){c.remove(),f()}),d.append(c)):f()},onScroll:function(){this.curScrollTop=this.$element.scrollTop(),this.curPercentage=this.getPercentage(),!this.fetchingData&&this.curPercentage>=this.options.percentage&&this.fetchData()}},a.fn.infinitescroll=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.infinitescroll"),h="object"==typeof b&&b;g||f.data("fu.infinitescroll",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.infinitescroll.defaults={dataSource:null,hybrid:!1,percentage:95},a.fn.infinitescroll.Constructor=c,a.fn.infinitescroll.noConflict=function(){return a.fn.infinitescroll=b,this}}(a),function(a){var b=a.fn.pillbox,c=function(b,c){this.$element=a(b),this.$moreCount=this.$element.find(".pillbox-more-count"),this.$pillGroup=this.$element.find(".pill-group"),this.$addItem=this.$element.find(".pillbox-add-item"),this.$addItemWrap=this.$addItem.parent(),this.$suggest=this.$element.find(".suggest"),this.$pillHTML='<li class="btn btn-default pill"> <span></span> <span class="glyphicon glyphicon-close"> <span class="sr-only">Remove</span> </span></li>',this.options=a.extend({},a.fn.pillbox.defaults,c),-1===this.options.readonly?void 0!==this.$element.attr("data-readonly")&&this.readonly(!0):this.options.readonly&&this.readonly(!0),this.acceptKeyCodes=this._generateObject(this.options.acceptKeyCodes),this.$element.on("click.fu.pillbox",".pill-group > .pill",a.proxy(this.itemClicked,this)),this.$element.on("click.fu.pillbox",a.proxy(this.inputFocus,this)),this.$element.on("keydown.fu.pillbox",".pillbox-add-item",a.proxy(this.inputEvent,this)),this.options.onKeyDown&&this.$element.on("mousedown.fu.pillbox",".suggest > li",a.proxy(this.suggestionClick,this)),this.options.edit&&(this.$element.addClass("pills-editable"),this.$element.on("blur.fu.pillbox",".pillbox-add-item",a.proxy(this.cancelEdit,this)))};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},items:function(){var b=this;return this.$pillGroup.children(".pill").map(function(){return b.getItemData(a(this))}).get()},itemClicked:function(b){var c,d=a(b.target);if(b.preventDefault(),b.stopPropagation(),this._closeSuggestions(),d.hasClass("pill"))c=d;else if(c=d.parent(),void 0===this.$element.attr("data-readonly")){if(d.hasClass("glyphicon-close"))return this.options.onRemove?this.options.onRemove(this.getItemData(c,{el:c}),a.proxy(this._removeElement,this)):this._removeElement(this.getItemData(c,{el:c})),!1;if(this.options.edit){if(c.find(".pillbox-list-edit").length)return!1;this.openEdit(c)}}this.$element.trigger("clicked.fu.pillbox",this.getItemData(c))},readonly:function(a){a?this.$element.attr("data-readonly","readonly"):this.$element.removeAttr("data-readonly"),this.options.truncate&&this.truncate(a)},suggestionClick:function(b){var c=a(b.currentTarget);b.preventDefault(),this.$addItem.val(""),this.addItems({text:c.html(),value:c.data("value")},!0),this._closeSuggestions()},itemCount:function(){return this.$pillGroup.children(".pill").length},addItems:function(){var b,c,d,e=this;!isFinite(String(arguments[0]))||arguments[0]instanceof Array?(b=[].slice.call(arguments).slice(0),d=b[1]&&!b[1].text):(b=[].slice.call(arguments).slice(1),c=arguments[0]),b[0]instanceof Array&&(b=b[0]),b.length&&(a.each(b,function(a,c){var d={text:c.text,value:c.value?c.value:c.text,el:e.$pillHTML};b[a]=d}),this.options.edit&&this.currentEdit&&(b[0].el=this.currentEdit.wrap("<div></div>").parent().html()),d&&b.pop(1),e.options.onAdd&&d?this.options.edit&&this.currentEdit?e.options.onAdd(b[0],a.proxy(e.saveEdit,this)):e.options.onAdd(b[0],a.proxy(e.placeItems,this,!0)):this.options.edit&&this.currentEdit?e.saveEdit(b):c?e.placeItems(c,b):e.placeItems(b,d))},removeItems:function(a,b){var c,d,e=this;if(a)for(b=b?b:1,c=0;b>c&&(d=e.$pillGroup.find("> .pill:nth-child("+a+")"),d);c++)d.remove();else this.$pillGroup.find(".pill").remove(),this._removePillTrigger({method:"removeAll"})},placeItems:function(){var b,c,d,e,f="";!isFinite(String(arguments[0]))||arguments[0]instanceof Array?(b=[].slice.call(arguments).slice(0),e=b[1]&&!b[1].text):(b=[].slice.call(arguments).slice(1),c=arguments[0]),b[0]instanceof Array&&(b=b[0]),b.length&&(a.each(b,function(b,c){var d=a(c.el);d.attr("data-value",c.value),d.find("span:first").html(c.text),f+=d.wrap("<div></div>").parent().html()}),this.$pillGroup.children(".pill").length>0?c?(d=this.$pillGroup.find(".pill:nth-child("+c+")"),d.length?d.before(f):this.$pillGroup.children(".pill:last").after(f)):this.$pillGroup.children(".pill:last").after(f):this.$pillGroup.prepend(f),e&&this.$element.trigger("added.fu.pillbox",{text:b[0].text,value:b[0].value}))},inputEvent:function(a){var b,c,d,e=this,f=this.$addItem.val();if(this.acceptKeyCodes[a.keyCode])return this.options.onKeyDown&&this._isSuggestionsOpen()&&(d=this.$suggest.find(".pillbox-suggest-sel"),d.length&&(f=d.html(),b=d.data("value"))),f.length&&(this._closeSuggestions(),this.$addItem.hide(),this.addItems({text:f,value:b},!0),setTimeout(function(){e.$addItem.show().val("").attr({size:10})},0)),a.preventDefault(),!0;if(8===a.keyCode||46===a.keyCode){if(!f.length)return a.preventDefault(),this.options.edit&&this.currentEdit?(this.cancelEdit(),!0):(this._closeSuggestions(),c=this.$pillGroup.children(".pill:last"),c.hasClass("pillbox-highlight")?this._removeElement(this.getItemData(c,{el:c})):c.addClass("pillbox-highlight"),!0)}else f.length>10&&this.$addItem.width()<this.$pillGroup.width()-6&&this.$addItem.attr({size:f.length+3});if(this.$pillGroup.find(".pill").removeClass("pillbox-highlight"),this.options.onKeyDown){if(9===a.keyCode||38===a.keyCode||40===a.keyCode)return this._isSuggestionsOpen()&&this._keySuggestions(a),!0;this.callbackId=a.timeStamp,this.options.onKeyDown({event:a,value:f},function(b){e._openSuggestions(a,b)})}},openEdit:function(a){var b=a.index()+1,c=this.$addItemWrap.detach().hide();this.$pillGroup.find(".pill:nth-child("+b+")").before(c),this.currentEdit=a.detach(),c.addClass("editing"),this.$addItem.val(a.find("span:first").html()),c.show(),this.$addItem.focus().select()},cancelEdit:function(a){var b;return this.currentEdit?(this._closeSuggestions(),a&&this.$addItemWrap.before(this.currentEdit),this.currentEdit=!1,b=this.$addItemWrap.detach(),b.removeClass("editing"),this.$addItem.val(""),void this.$pillGroup.append(b)):!1},saveEdit:function(){var b=arguments[0][0];this.currentEdit=a(b.el),this.currentEdit.data("value",b.value),this.currentEdit.find("span:first").html(b.text),this.$addItemWrap.hide(),this.$addItemWrap.before(this.currentEdit),this.currentEdit=!1,this.$addItem.val(""),this.$addItemWrap.removeClass("editing"),this.$pillGroup.append(this.$addItemWrap.detach().show()),this.$element.trigger("edited.fu.pillbox",{value:b.value,text:b.text})},removeBySelector:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find(b).remove()}),this._removePillTrigger({method:"removeBySelector",removedSelectors:b})},removeByValue:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find('> .pill[data-value="'+b+'"]').remove()}),this._removePillTrigger({method:"removeByValue",removedValues:b})},removeByText:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find('> .pill:contains("'+b+'")').remove()}),this._removePillTrigger({method:"removeByText",removedText:b})},truncate:function(b){var c,d,e,f,g,h=this;this.$element.removeClass("truncate"),this.$addItemWrap.removeClass("truncated"),this.$pillGroup.find(".pill").removeClass("truncated"),b&&(this.$element.addClass("truncate"),c=this.$element.width(),d=!1,e=0,f=this.$pillGroup.find(".pill").length,g=0,this.$pillGroup.find(".pill").each(function(){var b=a(this);d?b.addClass("truncated"):(e++,h.$moreCount.text(f-e),g+b.outerWidth(!0)+h.$addItemWrap.outerWidth(!0)<=c?g+=b.outerWidth(!0):(h.$moreCount.text(f-e+1),b.addClass("truncated"),d=!0))}),e===f&&this.$addItemWrap.addClass("truncated"))},inputFocus:function(){this.$element.find(".pillbox-add-item").focus()},getItemData:function(b,c){return a.extend({text:b.find("span:first").html()},b.data(),c)},_removeElement:function(a){a.el.remove(),delete a.el,this.$element.trigger("removed.fu.pillbox",a)},_removePillTrigger:function(a){this.$element.trigger("removed.fu.pillbox",a)},_generateObject:function(b){var c={};return a.each(b,function(a,b){c[b]=!0}),c},_openSuggestions:function(b,c){var d="";return this.callbackId!==b.timeStamp?!1:void(c.data&&c.data.length&&(a.each(c.data,function(a,b){var c=b.value?b.value:b.text;d+='<li data-value="'+c+'">'+b.text+"</li>"}),this.$suggest.html("").append(d),a(document.body).trigger("suggested.fu.pillbox",this.$suggest)))},_closeSuggestions:function(){this.$suggest.html("").parent().removeClass("open")},_isSuggestionsOpen:function(){return this.$suggest.parent().hasClass("open")},_keySuggestions:function(a){var b,c=this.$suggest.find("li.pillbox-suggest-sel"),d=38===a.keyCode;a.preventDefault(),c.length?(b=d?c.prev():c.next(),b.length||(b=this.$suggest.find(d?"li:last":"li:first")),b&&(b.addClass("pillbox-suggest-sel"),c.removeClass("pillbox-suggest-sel"))):(c=this.$suggest.find("li:first"),c.addClass("pillbox-suggest-sel"))}},a.fn.pillbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.pillbox"),h="object"==typeof b&&b; -g||f.data("fu.pillbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.pillbox.defaults={onAdd:void 0,onRemove:void 0,onKeyDown:void 0,edit:!1,readonly:-1,truncate:!1,acceptKeyCodes:[13,188]},a.fn.pillbox.Constructor=c,a.fn.pillbox.noConflict=function(){return a.fn.pillbox=b,this},a(document).on("mousedown.fu.pillbox.data-api","[data-initialize=pillbox]",function(b){var c=a(b.target).closest(".pillbox");c.data("fu.pillbox")||c.pillbox(c.data())}),a(function(){a("[data-initialize=pillbox]").each(function(){var b=a(this);b.data("fu.pillbox")||b.pillbox(b.data())})})}(a),function(a){var b=a.fn.repeater,c=function(b,c){var d,e=this;this.$element=a(b),this.$canvas=this.$element.find(".repeater-canvas"),this.$count=this.$element.find(".repeater-count"),this.$end=this.$element.find(".repeater-end"),this.$filters=this.$element.find(".repeater-filters"),this.$loader=this.$element.find(".repeater-loader"),this.$pageSize=this.$element.find(".repeater-itemization .selectlist"),this.$nextBtn=this.$element.find(".repeater-next"),this.$pages=this.$element.find(".repeater-pages"),this.$prevBtn=this.$element.find(".repeater-prev"),this.$primaryPaging=this.$element.find(".repeater-primaryPaging"),this.$search=this.$element.find(".repeater-search").find(".search"),this.$secondaryPaging=this.$element.find(".repeater-secondaryPaging"),this.$start=this.$element.find(".repeater-start"),this.$viewport=this.$element.find(".repeater-viewport"),this.$views=this.$element.find(".repeater-views"),this.eventStamp=(new Date).getTime()+(Math.floor(100*Math.random())+1),this.currentPage=0,this.currentView=null,this.infiniteScrollingCallback=function(){},this.infiniteScrollingCont=null,this.infiniteScrollingEnabled=!1,this.infiniteScrollingEnd=null,this.infiniteScrollingOptions={},this.lastPageInput=0,this.options=a.extend({},a.fn.repeater.defaults,c),this.pageIncrement=0,this.resizeTimeout={},this.staticHeight=-1===this.options.staticHeight?this.$element.attr("data-staticheight"):this.options.staticHeight,this.$filters.selectlist(),this.$pageSize.selectlist(),this.$primaryPaging.find(".combobox").combobox(),this.$search.search(),this.$filters.on("changed.fu.selectlist",a.proxy(this.render,this,{clearInfinite:!0,pageIncrement:null})),this.$nextBtn.on("click.fu.repeater",a.proxy(this.next,this)),this.$pageSize.on("changed.fu.selectlist",a.proxy(this.render,this,{pageIncrement:null})),this.$prevBtn.on("click.fu.repeater",a.proxy(this.previous,this)),this.$primaryPaging.find(".combobox").on("changed.fu.combobox",function(a,b){e.pageInputChange(b.text)}),this.$search.on("searched.fu.search cleared.fu.search",a.proxy(this.render,this,{clearInfinite:!0,pageIncrement:null})),this.$secondaryPaging.on("blur.fu.repeater",function(){e.pageInputChange(e.$secondaryPaging.val())}),this.$secondaryPaging.on("change.fu.repeater",function(){e.pageInputChange(e.$secondaryPaging.val())}),this.$views.find("input").on("change.fu.repeater",a.proxy(this.viewChanged,this)),a(window).on("resize.fu.repeater."+this.eventStamp,function(){clearTimeout(e.resizeTimeout),e.resizeTimeout=setTimeout(function(){e.resize(),e.$element.trigger("resized.fu.repeater")},75)}),this.$loader.loader(),this.$loader.loader("pause"),d=-1!==this.options.defaultView?this.options.defaultView:this.$views.find("label.active input").val(),this.initViews(function(){e.resize(),e.$element.trigger("resized.fu.repeater"),e.render({changeView:d})})};c.prototype={constructor:c,clear:function(b){var c=function(b){var d=[];b.children().each(function(){var b=a(this),e=b.attr("data-preserve");"deep"===e?(b.detach(),d.push(b)):"shallow"===e&&(c(b),b.detach(),d.push(b))}),b.empty(),b.append(d)};b=b||{},b.preserve?(!this.infiniteScrollingEnabled||b.clearInfinite)&&c(this.$canvas):this.$canvas.empty()},destroy:function(){var b;return this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$canvas.empty(),b=this.$element[0].outerHTML,this.$element.find(".combobox").combobox("destroy"),this.$element.find(".selectlist").selectlist("destroy"),this.$element.find(".search").search("destroy"),this.infiniteScrollingEnabled&&a(this.infiniteScrollingCont).infinitescroll("destroy"),this.$element.remove(),a(window).off("resize.fu.repeater."+this.eventStamp),b},getDataOptions:function(b,c){var d,e,f={};b=b||{},f.filter=this.$filters.selectlist("selectedItem"),f.view=this.currentView,this.infiniteScrollingEnabled||(f.pageSize=parseInt(this.$pageSize.selectlist("selectedItem").value,10)),void 0!==b.pageIncrement&&(null===b.pageIncrement?this.currentPage=0:this.currentPage+=b.pageIncrement),f.pageIndex=this.currentPage,d=this.$search.find("input").val(),""!==d&&(f.search=d),e=a.fn.repeater.views[this.currentView]||{},e=e.dataOptions,e?e.call(this,f,function(a){c(a)}):c(f)},infiniteScrolling:function(a,b){var c,d,e=this.$element.find(".repeater-itemization"),f=this.$element.find(".repeater-pagination");b=b||{},a?(this.infiniteScrollingEnabled=!0,this.infiniteScrollingEnd=b.end,delete b.dataSource,delete b.end,this.infiniteScrollingOptions=b,e.hide(),f.hide()):(c=this.infiniteScrollingCont,d=c.data(),delete d.infinitescroll,c.off("scroll"),c.removeClass("infinitescroll"),this.infiniteScrollingCont=null,this.infiniteScrollingEnabled=!1,this.infiniteScrollingEnd=null,this.infiniteScrollingOptions={},e.show(),f.show())},infiniteScrollPaging:function(a){var b=this.infiniteScrollingEnd!==!0?this.infiniteScrollingEnd:void 0,c=a.page,d=a.pages;this.currentPage=void 0!==c?c:0/0,this.currentPage+1>=d&&this.infiniteScrollingCont.infinitescroll("end",b)},initInfiniteScrolling:function(){var b,c,d=this.$canvas.find('[data-infinite="true"]:first');d=d.length<1?this.$canvas:d,d.data("fu.infinitescroll")?d.infinitescroll("enable"):(c=this,b=a.extend({},this.infiniteScrollingOptions),b.dataSource=function(a,b){c.infiniteScrollingCallback=b,c.render({pageIncrement:1})},d.infinitescroll(b),this.infiniteScrollingCont=d)},initViews:function(b){var c,d,e=[],f=function(a){var c=function(){a++,d>a?f(a):b()};e[a].initialize?e[a].initialize.call(this,{},function(){c()}):c()};for(c in a.fn.repeater.views)e.push(a.fn.repeater.views[c]);d=e.length,d>0?f(0):b()},itemization:function(a){this.$count.html(a.count||""),this.$end.html(a.end||""),this.$start.html(a.start||"")},next:function(){var a="disabled";this.$nextBtn.attr(a,a),this.$prevBtn.attr(a,a),this.pageIncrement=1,this.render({pageIncrement:this.pageIncrement})},pageInputChange:function(a){var b;a!==this.lastPageInput&&(this.lastPageInput=a,a=parseInt(a,10)-1,b=a-this.currentPage,this.render({pageIncrement:b}))},pagination:function(a){var b,c,d,e="active",f="disabled",g=a.page,h=a.pages;if(this.currentPage=void 0!==g?g:0/0,this.$primaryPaging.removeClass(e),this.$secondaryPaging.removeClass(e),h<=this.options.dropPagingCap){for(this.$primaryPaging.addClass(e),b=this.$primaryPaging.find(".dropdown-menu"),b.empty(),c=0;h>c;c++)d=c+1,b.append('<li data-value="'+d+'"><a href="#">'+d+"</a></li>");this.$primaryPaging.find("input.form-control").val(this.currentPage+1)}else this.$secondaryPaging.addClass(e),this.$secondaryPaging.val(this.currentPage+1);this.lastPageInput=this.currentPage+1+"",this.$pages.html(h),this.currentPage+1<h?this.$nextBtn.removeAttr(f):this.$nextBtn.attr(f,f),this.currentPage-1>=0?this.$prevBtn.removeAttr(f):this.$prevBtn.attr(f,f),0!==this.pageIncrement&&(this.pageIncrement>0?this.$nextBtn.is(":disabled")?this.$prevBtn.focus():this.$nextBtn.focus():this.$prevBtn.is(":disabled")?this.$nextBtn.focus():this.$prevBtn.focus())},previous:function(){var a="disabled";this.$nextBtn.attr(a,a),this.$prevBtn.attr(a,a),this.pageIncrement=-1,this.render({pageIncrement:this.pageIncrement})},render:function(b){var c,d=this,e=!1,f=a.fn.repeater.views[d.currentView]||{},g=function(){b.preserve=void 0!==b.preserve?b.preserve:!e,d.clear(b),(!d.infiniteScrollingEnabled||d.infiniteScrollingEnabled&&e)&&d.$loader.show().loader("play"),d.getDataOptions(b,function(a){d.options.dataSource(a,function(a){var c=f.renderer;d.infiniteScrollingEnabled?d.infiniteScrollingCallback({}):(d.itemization(a),d.pagination(a)),c&&d.runRenderer(d.$canvas,c,a,function(){d.infiniteScrollingEnabled&&((e||b.clearInfinite)&&d.initInfiniteScrolling(),d.infiniteScrollPaging(a,b)),d.$loader.hide().loader("pause"),d.$element.trigger("loaded.fu.repeater")})})})};b=b||{},b.changeView&&this.currentView!==b.changeView?(c=this.currentView,this.currentView=b.changeView,this.$element.attr("data-currentview",this.currentView),e=!0,this.infiniteScrollingEnabled&&d.infiniteScrolling(!1),f=a.fn.repeater.views[d.currentView]||{},f.selected?f.selected.call(this,{prevView:c},function(){g()}):g()):g()},resize:function(){var b,c,d=this.staticHeight,e=a.fn.repeater.views[this.currentView]||{};void 0!==d?(this.$canvas.addClass("scrolling"),c={bottom:this.$viewport.css("margin-bottom"),top:this.$viewport.css("margin-top")},b=("true"===d||d===!0?this.$element.height():parseInt(d,10))-this.$element.find(".repeater-header").outerHeight()-this.$element.find(".repeater-footer").outerHeight()-("auto"===c.bottom?0:parseInt(c.bottom,10))-("auto"===c.top?0:parseInt(c.top,10)),this.$viewport.outerHeight(b)):this.$canvas.removeClass("scrolling"),e.resize&&e.resize.call(this,{height:this.$element.outerHeight(),width:this.$element.outerWidth()},function(){})},runRenderer:function(b,c,d,e){var f,g,h,i,j=this,k=!1,l=function(a){var f={container:b,data:d};c.repeat&&(f.subset=g,f.index=a),g.length<1?e():m(f,function(){a++,a<g.length?l(a):e()})},m=function(e,f){var g="",h={before:function(a){a&&a.skipNested===!0&&(k=!0),i("render",e)},render:function(c){var d=c&&c.action?c.action:"append";c&&void 0!==c.item&&(g=a(c.item),g.length<1&&(g=c.item),"none"!==d&&b[d](g),e.item=g),c&&c.skipNested===!0&&(k=!0),i("after",e)},after:function(f){var l,m=function(a,b){j.runRenderer(a,c.nested[b],d,function(){b++,b<c.nested.length?m(a,b):i("complete",e)})};f&&f.skipNested===!0&&(k=!0),c.nested&&!k?(l=a(g),l="true"===l.attr("data-container")?l:l.find('[data-container="true"]:first'),l.length<1&&(l=b),m(l,0)):h.complete(null)},complete:function(){f&&f()}},i=function(b,d){d=a.extend({},d),c[b]?c[b].call(j,d,h[b]):h[b](null)};i("before",e)};if(c.repeat)for(f=c.repeat.split("."),"data"===f[0]||"this"===f[0]?(g="this"===f[0]?this:d,f.shift()):(f=[],g=[""]),h=0,i=f.length;i>h;h++)g=g[f[h]];else g=[""];l(0)},viewChanged:function(b){var c=a(b.target);this.render({changeView:c.val(),pageIncrement:null})}},a.fn.repeater=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.repeater"),h="object"==typeof b&&b;g||f.data("fu.repeater",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.repeater.defaults={dataSource:function(){},defaultView:-1,dropPagingCap:10,staticHeight:-1},a.fn.repeater.views={},a.fn.repeater.Constructor=c,a.fn.repeater.noConflict=function(){return a.fn.repeater=b,this}}(a),function(a){if(a.fn.repeater){a.fn.repeater.Constructor.prototype.clearSelectedItems=function(){this.$canvas.find(".repeater-list-check").remove(),this.$canvas.find(".repeater-list-items tr.selected").removeClass("selected")},a.fn.repeater.Constructor.prototype.getSelectedItems=function(){var b=[];return this.$canvas.find(".repeater-list-items tr.selected").each(function(){var c=a(this);b.push({data:c.data("item_data"),element:c})}),b},a.fn.repeater.Constructor.prototype.setSelectedItems=function(b,c){var d,e,f,g,h=this.options.list_selectable,i=this,j=function(){f=a(this),d=f.data("item_data")||{},d[b[e].property]===b[e].value&&k(f,b[e].selected)},k=function(a,b){b=void 0!==b?b:!0,b?(c||"multi"===h||i.clearSelectedItems(),a.hasClass("selected")||(a.addClass("selected"),a.find("td:first").prepend('<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>'))):(a.find(".repeater-list-check").remove(),a.removeClass("selected"))};for(a.isArray(b)||(b=[b]),g=c===!0||"multi"===h?b.length:h&&b.length>0?1:0,e=0;g>e;e++)void 0!==b[e].index?(f=this.$canvas.find(".repeater-list-items tr:nth-child("+(b[e].index+1)+")"),f.length>0&&k(f,b[e].selected)):void 0!==b[e].property&&void 0!==b[e].value&&this.$canvas.find(".repeater-list-items tr").each(j)},a.fn.repeater.defaults=a.extend({},a.fn.repeater.defaults,{list_columnRendered:null,list_columnSizing:!0,list_columnSyncing:!0,list_infiniteScroll:!1,list_noItemsHTML:"",list_selectable:!1,list_sortClearing:!1,list_rowRendered:null}),a.fn.repeater.views.list={dataOptions:function(a,b){this.list_sortDirection&&(a.sortDirection=this.list_sortDirection),this.list_sortProperty&&(a.sortProperty=this.list_sortProperty),b(a)},initialize:function(a,b){this.list_sortDirection=null,this.list_sortProperty=null,b()},selected:function(a,b){var c,d=this.options.list_infiniteScroll;this.list_firstRender=!0,this.$loader.addClass("noHeader"),d&&(c="object"==typeof d?d:{},this.infiniteScrolling(!0,c)),b({})},renderer:{complete:function(a,c){b.call(this,a,c)},nested:[{complete:function(b,c){var d,e,f,g,h=[],i=this;if(!this.options.list_columnSizing||this.list_columnsSame)c();else{if(d=0,g=0,b.item.find("td").each(function(){var b,c=a(this),e=0===c.next("td").length?!0:!1;void 0!==i.list_columns[d].width?(b=i.list_columns[d].width,c.outerWidth(b),g+=c.outerWidth(),e?c.outerWidth(""):i.list_columns[d]._auto_width=b):h.push({col:c,index:d,last:e}),d++}),e=h.length,e>0)for(f=Math.floor((this.$canvas.width()-g)/e),d=0;e>d;d++)h[d].last||(h[d].col.outerWidth(f),this.list_columns[h[d].index]._auto_width=f);c()}},render:function(a,b){var c=function(a,b){var c,d,e;if(!a)return!0;if(!b)return!1;for(c=0,e=b.length;e>c;c++){if(!a[c])return!0;for(d in b[c])if(a[c][d]!==b[c][d])return!0}return!1};this.list_firstRender||c(this.list_columns,a.data.columns)?(this.$element.find(".repeater-list-header").remove(),this.list_columns=a.data.columns,this.list_columnsSame=!1,this.list_firstRender=!1,this.$loader.removeClass("noHeader"),b({action:"prepend",item:'<table class="table repeater-list-header" data-preserve="deep" role="grid" aria-readonly="true"><tr data-container="true"></tr></table>'})):(this.list_columnsSame=!0,b({skipNested:!0}))},nested:[{render:function(b,c){var d,e,f,g,h="glyphicon-chevron",i=h+"-down",j=h+"-up",k=b.index,l=this,m=b.subset;d=m[k].cssClass,e=a('<td><span class="glyphicon"></span></td>'),e.addClass(void 0!==d?d:"").prepend(m[k].label),g=e.find("span.glyphicon:first"),f=m[k].sortable,f&&(e.addClass("sortable"),e.on("click.fu.repeater-list",function(){l.list_sortProperty="string"==typeof f?f:m[k].property,e.hasClass("sorted")?g.hasClass(j)?(g.removeClass(j).addClass(i),l.list_sortDirection="desc"):l.options.list_sortClearing?(e.removeClass("sorted"),g.removeClass(i),l.list_sortDirection=null,l.list_sortProperty=null):(g.removeClass(i).addClass(j),l.list_sortDirection="asc"):(b.container.find("td").removeClass("sorted"),g.removeClass(i).addClass(j),l.list_sortDirection="asc",e.addClass("sorted")),l.render({clearInfinite:!0,pageIncrement:null})})),("asc"===m[k].sortDirection||"desc"===m[k].sortDirection)&&(b.container.find("td").removeClass("sorted"),e.addClass("sortable sorted"),"asc"===m[k].sortDirection?(g.addClass(j),this.list_sortDirection="asc"):(g.addClass(i),this.list_sortDirection="desc"),this.list_sortProperty="string"==typeof f?f:m[k].property),c({item:e})},repeat:"data.columns"}]},{after:function(a,b){var c=this.$canvas,d=c.find(".repeater-list-header");this.staticHeight&&a.item.height(c.height()-d.outerHeight()),b()},render:function(b,c){var d,e=this.$canvas.find(".repeater-list-wrapper"),f={};e.length>0?f.action="none":e=a('<div class="repeater-list-wrapper" data-infinite="true"><table class="table repeater-list-items" data-container="true" role="grid" aria-readonly="true"></table></div>'),f.item=e,b.data.items.length<1?(f.skipNested=!0,d=a('<tr class="empty"><td></td></tr>'),d.find("td").append(this.options.list_noItemsHTML),e.find(".repeater-list-items").append(d)):e.find(".repeater-list-items tr.empty:first").remove(),c(f)},nested:[{complete:function(a,b){var c={container:a.container};void 0!==a.item&&(c.item=a.item),this.options.list_rowRendered?this.options.list_rowRendered(c,function(){b()}):b()},render:function(b,c){var d=a('<tr data-container="true"></tr>'),e=this;this.options.list_selectable&&(d.addClass("selectable"),d.attr("tabindex",0),d.data("item_data",b.subset[b.index]),d.on("click.fu.repeater-list",function(){var b=a(this);b.hasClass("selected")?(b.removeClass("selected"),b.find(".repeater-list-check").remove(),e.$element.trigger("itemDeselected.fu.repeater",b)):("multi"!==e.options.list_selectable&&(e.$canvas.find(".repeater-list-check").remove(),e.$canvas.find(".repeater-list-items tr.selected").each(function(){a(this).removeClass("selected"),e.$element.trigger("itemDeselected.fu.repeater",a(this))})),b.addClass("selected"),b.find("td:first").prepend('<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>'),e.$element.trigger("itemSelected.fu.repeater",b))}),d.keyup(function(a){13===a.keyCode&&d.trigger("click.fu.repeater-list")})),this.list_curRowIndex=b.index,c({item:d})},repeat:"data.items",nested:[{after:function(a,b){var c={container:a.container};void 0!==a.item&&(c.item=a.item),this.options.list_columnRendered?this.options.list_columnRendered(c,function(){b()}):b()},render:function(b,c){var d=b.subset[b.index].cssClass,e=b.data.items[this.list_curRowIndex][b.subset[b.index].property],f=a("<td></td>"),g=b.subset[b.index]._auto_width;f.addClass(void 0!==d?d:"").append(e),void 0!==g&&f.outerWidth(g),c({item:f})},repeat:"this.list_columns"}]}]}]},resize:function(a,c){b.call(this,{data:{items:[""]}},c)}};var b=function(b,c){var d,e,f=0,g=[];!this.options.list_columnSyncing||b.data.items.length<1?c():(d=this.$element.find(".repeater-list-header:first"),e=this.$element.find(".repeater-list-items:first"),e.find("tr:first td").each(function(){g.push(a(this).outerWidth())}),g.pop(),d.find("td").each(function(){void 0!==g[f]&&a(this).outerWidth(g[f]),f++}),c())}}}(a),function(a){a.fn.repeater&&(a.fn.repeater.defaults=a.extend({},a.fn.repeater.defaults,{thumbnail_infiniteScroll:!1,thumbnail_itemRendered:null,thumbnail_template:'<div class="thumbnail repeater-thumbnail" style="background-color: {{color}};"><img height="75" src="{{src}}" width="65"><span>{{name}}</span></div>'}),a.fn.repeater.views.thumbnail={selected:function(a,b){var c,d=this.options.thumbnail_infiniteScroll;d&&(c="object"==typeof d?d:{},this.infiniteScrolling(!0,c)),b({})},renderer:{render:function(b,c){var d,e=this.$element.find(".repeater-thumbnail-cont"),f={};e.length>0?f.action="none":e=a('<div class="clearfix repeater-thumbnail-cont" data-container="true" data-infinite="true" data-preserve="shallow"></div>'),f.item=e,b.data.items.length<1?(f.skipNested=!0,d=a('<div class="empty"></div>'),d.append(this.options.thumbnail_noItemsHTML),e.append(d)):e.find(".empty:first").remove(),c(f)},nested:[{after:function(a,b){var c={container:a.container};void 0!==a.item&&(c.item=a.item),this.options.thumbnail_itemRendered?this.options.thumbnail_itemRendered(c,function(){b()}):b()},render:function(b,c){var d=b.subset[b.index],e=function(b){for(var c=!1,e=function(){var e,f,g;f=b.indexOf("{{"),e=b.indexOf("}}",f+2),f>-1&&e>-1?(g=a.trim(b.substring(f+2,e)),g=void 0!==d[g]?d[g]:"",b=b.substring(0,f)+g+b.substring(e+2)):c=!0};!c&&b.search("{{")>=0;)e(b);return b};c({item:e(this.options.thumbnail_template)})},repeat:"data.items"}]}})}(a),function(a){var b=a.fn.scheduler,c=function(b,c){var d=this;this.$element=a(b),this.options=a.extend({},a.fn.scheduler.defaults,c),this.$startDate=this.$element.find(".start-datetime .start-date"),this.$startTime=this.$element.find(".start-datetime .start-time"),this.$timeZone=this.$element.find(".timezone-container .timezone"),this.$repeatIntervalPanel=this.$element.find(".repeat-every-panel"),this.$repeatIntervalSelect=this.$element.find(".repeat-options"),this.$repeatIntervalSpinbox=this.$element.find(".repeat-every"),this.$repeatIntervalTxt=this.$element.find(".repeat-every-text"),this.$end=this.$element.find(".repeat-end"),this.$endSelect=this.$end.find(".end-options"),this.$endAfter=this.$end.find(".end-after"),this.$endDate=this.$end.find(".end-on-date"),this.$recurrencePanels=this.$element.find(".repeat-panel"),this.$repeatIntervalSelect.selectlist(),this.$element.find(".selectlist").selectlist(),this.$startDate.datepicker(),this.$startTime.combobox(),""===this.$startTime.find("input").val()&&this.$startTime.combobox("selectByIndex",0),this.$repeatIntervalSpinbox.spinbox("0"===this.$repeatIntervalSpinbox.find("input").val()?{value:1,min:1}:{min:1}),this.$endAfter.spinbox({value:1,min:1}),this.$endDate.datepicker(),this.$element.find(".radio-custom").radio(),this.$repeatIntervalSelect.on("changed.fu.selectlist",a.proxy(this.repeatIntervalSelectChanged,this)),this.$endSelect.on("changed.fu.selectlist",a.proxy(this.endSelectChanged,this)),this.$element.find(".repeat-days-of-the-week .btn-group .btn").on("change.fu.scheduler",function(a,b){d.changed(a,b,!0)}),this.$element.find(".combobox").on("changed.fu.combobox",a.proxy(this.changed,this)),this.$element.find(".datepicker").on("changed.fu.datepicker",a.proxy(this.changed,this)),this.$element.find(".selectlist").on("changed.fu.selectlist",a.proxy(this.changed,this)),this.$element.find(".spinbox").on("changed.fu.spinbox",a.proxy(this.changed,this)),this.$element.find(".repeat-monthly .radio, .repeat-yearly .radio").on("change.fu.scheduler",a.proxy(this.changed,this))};c.prototype={constructor:c,destroy:function(){var b;return this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element.find(".datepicker .calendar").empty(),b=this.$element[0].outerHTML,this.$element.find(".combobox").combobox("destroy"),this.$element.find(".datepicker").datepicker("destroy"),this.$element.find(".selectlist").selectlist("destroy"),this.$element.find(".spinbox").spinbox("destroy"),this.$element.find("[type=radio]").radio("destroy"),this.$element.remove(),b},changed:function(b,c,d){d||b.stopPropagation(),this.$element.trigger("changed.fu.scheduler",{data:void 0!==c?c:a(b.currentTarget).data(),originalEvent:b,value:this.getValue()})},disable:function(){this.toggleState("disable")},enable:function(){this.toggleState("enable")},endSelectChanged:function(a,b){var c,d;b?d=b.value:(c=this.$endSelect.selectlist("selectedItem"),d=c.value),this.$endAfter.parent().addClass("hide"),this.$endAfter.parent().attr("aria-hidden","true"),this.$endDate.parent().addClass("hide"),this.$endDate.parent().attr("aria-hidden","true"),"after"===d?(this.$endAfter.parent().removeClass("hide"),this.$endAfter.parent().attr("aria-hidden","false")):"date"===d&&(this.$endDate.parent().removeClass("hide"),this.$endDate.parent().attr("aria-hidden","false"))},getValue:function(){var b,c=this.$repeatIntervalSpinbox.spinbox("value"),d="",e=this.$repeatIntervalSelect.selectlist("selectedItem").value,f=this.$startTime.combobox("selectedItem").text.toLowerCase(),g=this.$timeZone.selectlist("selectedItem");b=function(a,b){var c,d="";return d+=a.getFullYear(),d+=b,c=a.getMonth()+1,d+=10>c?"0"+c:c,d+=b,c=a.getDate(),d+=10>c?"0"+c:c};var h,i,j,k,l,m,n,o;n=""+b(this.$startDate.datepicker("getDate"),"-"),n+="T",j=f.search("am")>=0,k=f.search("pm")>=0,f=a.trim(f.replace(/am/g,"").replace(/pm/g,"")).split(":"),f[0]=parseInt(f[0],10),f[1]=parseInt(f[1],10),j&&f[0]>11?f[0]=0:k&&f[0]<12&&(f[0]+=12),n+=f[0]<10?"0"+f[0]:f[0],n+=":",n+=f[1]<10?"0"+f[1]:f[1],n+="+00:00"===g.offset?"Z":g.offset,"none"===e?d="FREQ=DAILY;INTERVAL=1;COUNT=1;":"hourly"===e?(d="FREQ=HOURLY;",d+="INTERVAL="+c+";"):"daily"===e?(d+="FREQ=DAILY;",d+="INTERVAL="+c+";"):"weekdays"===e?(d+="FREQ=DAILY;",d+="BYDAY=MO,TU,WE,TH,FR;",d+="INTERVAL=1;"):"weekly"===e?(i=[],this.$element.find(".repeat-days-of-the-week .btn-group input:checked").each(function(){i.push(a(this).data().value)}),d+="FREQ=WEEKLY;",d+="BYDAY="+i.join(",")+";",d+="INTERVAL="+c+";"):"monthly"===e?(d+="FREQ=MONTHLY;",d+="INTERVAL="+c+";",o=this.$element.find("input[name=repeat-monthly]:checked").val(),"bymonthday"===o?(h=parseInt(this.$element.find(".repeat-monthly-date .selectlist").selectlist("selectedItem").text,10),d+="BYMONTHDAY="+h+";"):"bysetpos"===o&&(i=this.$element.find(".month-days").selectlist("selectedItem").value,m=this.$element.find(".month-day-pos").selectlist("selectedItem").value,d+="BYDAY="+i+";",d+="BYSETPOS="+m+";")):"yearly"===e&&(d+="FREQ=YEARLY;",o=this.$element.find("input[name=repeat-yearly]:checked").val(),"bymonthday"===o?(l=this.$element.find(".repeat-yearly-date .year-month").selectlist("selectedItem").value,h=this.$element.find(".year-month-day").selectlist("selectedItem").text,d+="BYMONTH="+l+";",d+="BYMONTHDAY="+h+";"):"bysetpos"===o&&(i=this.$element.find(".year-month-days").selectlist("selectedItem").value,m=this.$element.find(".year-month-day-pos").selectlist("selectedItem").value,l=this.$element.find(".repeat-yearly-day .year-month").selectlist("selectedItem").value,d+="BYDAY="+i+";",d+="BYSETPOS="+m+";",d+="BYMONTH="+l+";"));var p=this.$endSelect.selectlist("selectedItem").value,q="";"none"!==e&&("after"===p?q="COUNT="+this.$endAfter.spinbox("value")+";":"date"===p&&(q="UNTIL="+b(this.$endDate.datepicker("getDate"),"")+";")),d+=q;var r={startDateTime:n,timeZone:{name:g.name,offset:g.offset},recurrencePattern:d};return r},repeatIntervalSelectChanged:function(a,b){var c,d,e;switch(b?(d=b.value,e=b.text):(c=this.$repeatIntervalSelect.selectlist("selectedItem"),d=c.value,e=c.text),this.$repeatIntervalTxt.text(e),d.toLowerCase()){case"hourly":case"daily":case"weekly":case"monthly":this.$repeatIntervalPanel.removeClass("hide"),this.$repeatIntervalPanel.attr("aria-hidden","false");break;default:this.$repeatIntervalPanel.addClass("hide"),this.$repeatIntervalPanel.attr("aria-hidden","true")}this.$recurrencePanels.addClass("hide"),this.$recurrencePanels.attr("aria-hidden","true"),this.$element.find(".repeat-"+d).removeClass("hide"),this.$element.find(".repeat-"+d).attr("aria-hidden","false"),"none"===d?(this.$end.addClass("hide"),this.$end.attr("aria-hidden","true")):(this.$end.removeClass("hide"),this.$end.attr("aria-hidden","false"))},setValue:function(b){var c,d,e,f,g,h,i,j;if(b.startDateTime&&(j=b.startDateTime.split("T"),this.$startDate.datepicker("setDate",j[0]),j[1]&&(j[1]=j[1].split(":"),c=parseInt(j[1][0],10),g=j[1][1]?parseInt(j[1][1].split("+")[0].split("-")[0].split("Z")[0],10):0,h=12>c?"AM":"PM",0===c?c=12:c>12&&(c-=12),g=10>g?"0"+g:g,j=c+":"+g+" "+h,this.$startTime.find("input").val(j),this.$startTime.combobox("selectByText",j))),e="li[data",b.timeZone?(e+="string"==typeof b.timeZone?'-name="'+b.timeZone:b.timeZone.name?'-name="'+b.timeZone.name:'-offset="'+b.timeZone.offset,e+='"]',this.$timeZone.selectlist("selectBySelector",e)):b.startDateTime&&(j=b.startDateTime.split("T")[1],j=j?j.search(/\+/)>-1?"+"+a.trim(j.split("+")[1]):j.search(/\-/)>-1?"-"+a.trim(j.split("-")[1]):"+00:00":"+00:00",e+='-offset="'+j+'"]',this.$timeZone.selectlist("selectBySelector",e)),b.recurrencePattern){for(i={},j=b.recurrencePattern.toUpperCase().split(";"),d=0,f=j.length;f>d;d++)""!==j[d]&&(e=j[d].split("="),i[e[0]]=e[1]);if("DAILY"===i.FREQ)e="MO,TU,WE,TH,FR"===i.BYDAY?"weekdays":"1"===i.INTERVAL&&"1"===i.COUNT?"none":"daily";else if("HOURLY"===i.FREQ)e="hourly";else if("WEEKLY"===i.FREQ){if(i.BYDAY)for(e=this.$element.find(".repeat-days-of-the-week .btn-group"),e.find("label").removeClass("active"),j=i.BYDAY.split(","),d=0,f=j.length;f>d;d++)e.find('input[data-value="'+j[d]+'"]').parent().addClass("active");e="weekly"}else"MONTHLY"===i.FREQ?(this.$element.find(".repeat-monthly input").removeAttr("checked").removeClass("checked"),this.$element.find(".repeat-monthly label.radio-custom").removeClass("checked"),i.BYMONTHDAY?(j=this.$element.find(".repeat-monthly-date"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),j.find(".selectlist").selectlist("selectByValue",i.BYMONTHDAY)):i.BYDAY&&(j=this.$element.find(".repeat-monthly-day"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),i.BYSETPOS&&j.find(".month-day-pos").selectlist("selectByValue",i.BYSETPOS),j.find(".month-days").selectlist("selectByValue",i.BYDAY)),e="monthly"):"YEARLY"===i.FREQ?(this.$element.find(".repeat-yearly input").removeAttr("checked").removeClass("checked"),this.$element.find(".repeat-yearly label.radio-custom").removeClass("checked"),i.BYMONTHDAY?(j=this.$element.find(".repeat-yearly-date"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),i.BYMONTH&&j.find(".year-month").selectlist("selectByValue",i.BYMONTH),j.find(".year-month-day").selectlist("selectByValue",i.BYMONTHDAY)):i.BYSETPOS&&(j=this.$element.find(".repeat-yearly-day"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),j.find(".year-month-day-pos").selectlist("selectByValue",i.BYSETPOS),i.BYDAY&&j.find(".year-month-days").selectlist("selectByValue",i.BYDAY),i.BYMONTH&&j.find(".year-month").selectlist("selectByValue",i.BYMONTH)),e="yearly"):e="none";i.COUNT?(this.$endAfter.spinbox("value",parseInt(i.COUNT,10)),this.$endSelect.selectlist("selectByValue","after")):i.UNTIL&&(j=i.UNTIL,8===j.length&&(j=j.split(""),j.splice(4,0,"-"),j.splice(7,0,"-"),j=j.join("")),this.$endDate.datepicker("setDate",j),this.$endSelect.selectlist("selectByValue","date")),this.endSelectChanged(),i.INTERVAL&&this.$repeatIntervalSpinbox.spinbox("value",parseInt(i.INTERVAL,10)),this.$repeatIntervalSelect.selectlist("selectByValue",e),this.repeatIntervalSelectChanged()}},toggleState:function(a){this.$element.find(".combobox").combobox(a),this.$element.find(".datepicker").datepicker(a),this.$element.find(".selectlist").selectlist(a),this.$element.find(".spinbox").spinbox(a),this.$element.find("[type=radio]").radio(a),a="disable"===a?"addClass":"removeClass",this.$element.find(".repeat-days-of-the-week .btn-group")[a]("disabled")},value:function(a){return a?this.setValue(a):this.getValue()}},a.fn.scheduler=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.scheduler"),h="object"==typeof b&&b;g||f.data("fu.scheduler",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.scheduler.defaults={},a.fn.scheduler.Constructor=c,a.fn.scheduler.noConflict=function(){return a.fn.scheduler=b,this},a(document).on("mousedown.fu.scheduler.data-api","[data-initialize=scheduler]",function(b){var c=a(b.target).closest(".scheduler");c.data("fu.scheduler")||c.scheduler(c.data())}),a(function(){a("[data-initialize=scheduler]").each(function(){var b=a(this);b.data("scheduler")||b.scheduler(b.data())})})}(a)}); \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/jquery/js/jquery.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/jquery/js/jquery.js deleted file mode 100644 index 83589daa707a25a1fb3e4112075d382e9a1611ab..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/jquery/js/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.3 jquery.com | jquery.org/license */ -(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/LICENSE.txt b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/LICENSE.txt deleted file mode 100644 index becb6be5b962b2a5b7fa80fe2dd32bead7044e98..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -MIT license \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/VERSION.txt b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/VERSION.txt deleted file mode 100644 index 0e2c93950bb65d053566355a9458a743878b70d8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/VERSION.txt +++ /dev/null @@ -1 +0,0 @@ -0.7 \ No newline at end of file diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/js/naturalSort.js b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/js/naturalSort.js deleted file mode 100644 index f6dc3951c1367acc151a52c5dd9421addddd390c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/html/lib/naturalsort/js/naturalSort.js +++ /dev/null @@ -1,56 +0,0 @@ -/** -* -* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license -* Author: Jim Palmer (based on chunking idea from Dave Koelle) -* -* @param a first string to compare -* @param b second string to compare -* @return 1 if a > b, 0 if a == b, -1 if a < b -* -* @see http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support/ -*/ -naturalSort = function(a, b) { - var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, - sre = /(^[ ]*|[ ]*$)/g, - dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, - hre = /^0x[0-9a-f]+$/i, - ore = /^0/, - i = function(s) { - return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; - }, - // convert all to strings strip whitespace - x = i(a).replace(sre, '') || '', - y = i(b).replace(sre, '') || '', - // chunk/tokenize - xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/,'').split('\0'), - yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/,'').split('\0'), - // numeric, hex or date detection - xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), - yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null, oFxNcL, oFyNcL; - // first try and sort Hex codes or Dates - if (yD) - if (xD < yD) - return -1; - else if (xD > yD) - return 1; - // natural sorting through split numeric strings and default strings - for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { - // find floats not starting with '0', string or 0 if not defined (Clint Priest) - oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; - oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; - // handle numeric vs string comparison - number < string - (Kyle Adams) - if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { - return (isNaN(oFxNcL)) ? 1 : -1; - } - // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' - else if (typeof oFxNcL !== typeof oFyNcL) { - oFxNcL += ''; - oFyNcL += ''; - } - if (oFxNcL < oFyNcL) - return -1; - if (oFxNcL > oFyNcL) - return 1; - } -return 0; -}; diff --git a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/plugin.properties b/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/plugin.properties deleted file mode 100644 index 7386c4873030d2d7423dcfedbcb0a618abb2ef64..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/fuelux/1/as/webapps/fuelux-widget-webapp/plugin.properties +++ /dev/null @@ -1,4 +0,0 @@ -label = FuelUX Widget -webapp-folder = html -openbisui-contexts = experiment-details-view -experiment-entity-types = .* \ No newline at end of file diff --git a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/BioFormatsProcessor.py b/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/BioFormatsProcessor.py deleted file mode 100644 index e319c0d6cc7f02309dae12615a3987012fee94ce..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/BioFormatsProcessor.py +++ /dev/null @@ -1,440 +0,0 @@ -""" -Created on Feb 6, 2014 - -@author: Aaron Ponti, Franz-Josef Elmer -""" - -from loci.formats import FormatTools -from loci.formats import ChannelSeparator -from loci.formats import ChannelFiller -from loci.formats import MetadataTools -from ch.systemsx.cisd.imagereaders import ImageReaderFactory - -class BioFormatsProcessor: - """The BioFormatsProcessor class scans a file using the bio-formats library and - extracts relevant metadata information for registration.""" - - # File path - _filePath = None - - # LOCI reader object - _reader = None - - # OME metadata store object - _metadataStore = None - - # Number of series in the file - _nSeries = 0 - - # Array of metadata disctionaries (one per series) - _metadata = [] - - - def __init__(self, file): - """ - Constructor. - """ - - # Microscopy file path - self._filePath = file.getPath() - - # Initialize the LOCI reader - self._reader = ChannelSeparator(ChannelFiller()) - self._reader.setMetadataStore(MetadataTools.createOMEXMLMetadata()) - - # Set the filename - self._reader.setId(self._filePath) - - # Store a reference to the OME metadata store - self._metadataStore = self._reader.getMetadataStore() - - # Initialize the metadata structure - self._initMetadata() - reader = ImageReaderFactory.tryGetReaderForFile("BioFormats", self._filePath) - - print ">>>>>>>>>>>>>" - print "File: %s" % file - print "Reader: %s" % reader.getName() - imageIDs = reader.getImageIDs(file) - print "ImageIDs: %s" % imageIDs - seriesIndex = -1 - for id in imageIDs: - if seriesIndex != id.seriesIndex: - seriesIndex = id.seriesIndex - metaData = reader.readMetaData(file, id, None) - print "Meta data for image ID '%s'" % id - for k in metaData: - try: - print " %s: %s" % (k, metaData[k]) - except: - pass - - def extractMetadata(self): - """Extract and store needed metadata""" - - # Dataset sizes - self._getDatasetSizes() - - # Data types - self._getDataTypes() - - # Voxel sizes - self._getVoxelSizes() - - # Acquisition dates - self._getAcquisitionDates() - - # Mark thumbnails - self._markThumbnails() - - # Channel names - self._getChannelNames() - - # Channel colors - self._getChannelColors() - - # Get wavelengths - self._getWavelengths() - - # Get time stamps - self._getTimeStamps() - - - def getMetadata(self): - """ - Return the extracted metadata. - """ - - return self._metadata - - - def getNumSeries(self): - """ - Return the number of series in file. - """ - - return self._nSeries - - - # # # - # # # PRIVATE METHODS - # # # - - def _initMetadata(self): - - # Initialize metadata dictionary - metadata = {'seriesNumber' : 0, - 'nImages' : 0, - 'sizeX' : 0, - 'sizeY' : 0, - 'sizeZ' : 0, - 'sizeC' : 0, - 'sizeT' : 0, - 'voxelSizeX' : 0, - 'voxelSizeY' : 0, - 'voxelSizeZ' : 0, - 'datatype' : None, - 'isLittleEndian' : False, - 'isSigned' : False, - 'isThumbnail' : False, - 'acquisitionDate' : '', - 'channelNames' : [], - 'channelColors' : [], - 'emWavelengths' : [], - 'exWavelengths' : [], - 'NumericalAperture' : 0, - 'timestamps' : []} - - # Get and store the number of series - self._nSeries = self._reader.getSeriesCount() - - # Initialize metadata dictionaries (one per series) - n = 0 - while n < self._nSeries: - self._metadata.append(metadata.copy()) - n += 1 - - - def _getAcquisitionDates(self): - """ - Extract the acquisition dates from all series. - """ - - # Get and store all acquisition dates - for n in range(self._nSeries): - - # Change to current series - self._reader.setSeries(n) - - acqDate = self._metadataStore.getImageAcquisitionDate(n) - if acqDate is None: - acqDate = '' - else: - acqDate = acqDate.getValue() - - self._metadata[n]['acquisitionDate'] = acqDate - - - def _getChannelColors(self): - """ - Extracts the colors as RGBA vectors of all channels from all series. - """ - - # Get and store all channel names - for n in range(self._nSeries): - - # Initialize - self._metadata[n]['channelColors'] = [] - - # Change to series - self._reader.setSeries(n) - - # Get the number of channels in this series - nChannels = self._reader.getSizeC() - - for ch in range(nChannels): - - # Get the channel color - color = self._metadataStore.getChannelColor(n, ch) - if color is None: - colorsRGBA = [255, 255, 255, 255] - else: - colorsRGBA = [color.getRed(), color.getGreen(), - color.getBlue(), color.getAlpha()] - - # Store color for current channel in current series - self._metadata[n]['channelColors'].append(colorsRGBA) - - - def _getChannelNames(self): - """ - Extracts the names of all channels from all series. - """ - - # Get and store all channel names - for n in range(self._nSeries): - - # Initialize - self._metadata[n]['channelNames'] = [] - - # Change to series - self._reader.setSeries(n) - - # Get the number of channels in this series - nChannels = self._reader.getSizeC() - - for ch in range(nChannels): - - # Get channel name - name = self._metadataStore.getChannelName(n, ch) - if name is None: - name = "No name" - - # Remove 0-byte at the end of the string if present - if name.endswith('\x00'): - name = name[:-1] - - # Store name for current channel in current series - self._metadata[n]['channelNames'].append(name) - - - def _getDatasetSizes(self): - """ - Extract dataset sizes for all series. - """ - - # Get and store all dataset sizes for all series - for n in range(self._nSeries): - - # Change to current series - self._reader.setSeries(n) - - # Get sizes - self._metadata[n]['nImages'] = self._reader.getImageCount(); - self._metadata[n]['sizeX'] = self._reader.getSizeX(); - self._metadata[n]['sizeY'] = self._reader.getSizeY(); - self._metadata[n]['sizeZ'] = self._reader.getSizeZ(); - self._metadata[n]['sizeC'] = self._reader.getSizeC(); - self._metadata[n]['sizeT'] = self._reader.getSizeT(); - - - def _getDataTypes(self): - """ - Get data types for all series. - """ - - # Get and store all dataset sizes for all series - for n in range(self._nSeries): - - # Change to current series - self._reader.setSeries(n) - - # Get the pixel type - pixelType = self._reader.getPixelType() - - # Bytes per pixel - BytesPerPixel = FormatTools.getBytesPerPixel(pixelType) - if BytesPerPixel == 1: - datatype = 'uint8' - elif BytesPerPixel == 2: - datatype = 'uint16' - elif BytesPerPixel == 4: - # This is 32-bit floating point - datatype = 'single' - else: - datatype = "unsupported" - - # Is the data type signed? - isSigned = FormatTools.isSigned(pixelType) - - # Endianity - isLittleEndian = self._reader.isLittleEndian() - - # Store data type information - self._metadata[n]['datatype'] = datatype - self._metadata[n]['isLittleEndian'] = isLittleEndian - self._metadata[n]['isSigned'] = isSigned - - - def _getNAs(self): - """ - Get the numerical aperture for all series. - """ - - # Get and store all numerical apertures - for n in range(self._nSeries): - - # Initialize - self._metadata[n]['NumericalAperture'] = [] - - # Change to series - self._reader.setSeries(n) - - # Get the number of instruments and objectives for this series - # Expected: 1 and 1. - nInstr = self._metadataStore.getInstrumentCount() - nObj = self._metadataStore.getObjectiveCount() - - for i in range(nInstr): - for o in range(nObj): - NA = self._metadataStore.getObjectiveLensNA(i, o) - self._metadata[n]['NumericalAperture'].append(NA) - - - def _getTimeStamps(self): - """ - Extracts the timestamps from all series. - """ - - # Get and store all channel names - for n in range(self._nSeries): - - # Initialize - self._metadata[n]['timestamps'] = [] - - # Change to series - self._reader.setSeries(n) - - # Number of time stamps to retrieve - nTimepoints = self._reader.getSizeT() - - # Iterate over the keys and get the values - for tp in range(nTimepoints): - - option = 'timestamp ' + str(tp) - t = self._reader.getSeriesMetadataValue(option) - if t is None: - t = "NaN" - - # Store timestamps for current series - self._metadata[n]['timestamps'].append(t) - - - def _getVoxelSizes(self): - """ - Extract voxel sizes for all series. - """ - - # Get and store all voxel sizes for all series - for n in range(self._nSeries): - - # Change to current series - self._reader.setSeries(n) - - # Voxel size X - voxelX = self._metadataStore.getPixelsPhysicalSizeX(n) - if voxelX is None: - voxelX = 0; - else: - voxelX = voxelX.value() - - self._metadata[n]['voxelSizeX'] = voxelX - - # Voxel size Y - voxelY = self._metadataStore.getPixelsPhysicalSizeY(n) - if voxelY is None: - voxelY = 0; - else: - voxelY = voxelY.value() - - self._metadata[n]['voxelSizeY'] = voxelY - - # Voxel size Z - voxelZ = self._metadataStore.getPixelsPhysicalSizeZ(n) - if voxelZ is None: - voxelZ = 0; - else: - voxelZ = voxelZ.value() - - self._metadata[n]['voxelSizeZ'] = voxelZ - - - def _getWavelengths(self): - """ - Extracts the excitation and emission wavelengths of all channels - from all series. - """ - - # Get and store all channel names - for n in range(self._nSeries): - - # Initialize - self._metadata[n]['exWavelengths'] = [] - self._metadata[n]['emWavelengths'] = [] - - # Change to series - self._reader.setSeries(n) - - # Get the number of channels in this series - nChannels = self._reader.getSizeC() - - for ch in range(nChannels): - - # Get and store emission wavelength for current channel in - # current series - em = self._metadataStore.getChannelEmissionWavelength(n, ch) - if em is None: - em = "NaN" - self._metadata[n]['emWavelengths'].append(em) - - # Get and store excitation wavelength for current channel in - # current series - ex = self._metadataStore.getChannelExcitationWavelength(n, ch) - if ex is None: - ex = "NaN" - self._metadata[n]['exWavelengths'].append(ex) - - - def _markThumbnails(self): - """ - Mark which series contain thumbnails. - """ - - # Mark all series whether they are thumbnails or not - for n in range(self._nSeries): - - # Change to current series - self._reader.setSeries(n) - - # Check if thumbnail - self._metadata[n]['isThumbnail'] = self._reader.isThumbnailSeries() diff --git a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/MicroscopySingleDatasetConfig.py b/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/MicroscopySingleDatasetConfig.py deleted file mode 100644 index a904afb2f542ff3024692baa14545d29d85fb70e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/MicroscopySingleDatasetConfig.py +++ /dev/null @@ -1,187 +0,0 @@ -""" - -@author: Aaron Ponti, Franz-Josef Elmer -""" - -import re -from ch.systemsx.cisd.openbis.dss.etl.dto.api import SimpleImageDataConfig -from ch.systemsx.cisd.openbis.dss.etl.dto.api import SimpleImageContainerDataConfig -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ChannelColor -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ImageIdentifier -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ImageMetadata -from ch.systemsx.cisd.openbis.dss.etl.dto.api import OriginalDataStorageFormat -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ChannelColorRGB -from ch.systemsx.cisd.openbis.dss.etl.dto.api import Channel -from ch.systemsx.cisd.openbis.dss.etl.dto.api.impl import MaximumIntensityProjectionGenerationAlgorithm - -class MicroscopySingleDatasetConfig(SimpleImageContainerDataConfig): - # MetadataReader used to extract relevant metadata information using - # the LOCI bio-formats library. - _metadataReader = None - - # Number of the series to register (for a multi-series dataset. - _seriesNum = 0 - - def __init__(self, metadataReader, seriesNum=0): - """Constructor. - - @param metadataReader: MetadataReader object (with extracted metadata) - @param seriesNum: Int Number of the series to register. All other series in - the file will be ignored. - """ - - self._metadataReader = metadataReader - self._seriesNum = seriesNum - - self.setMicroscopyData(True) - self.setDataSetType("MICROSCOPY_IMG") - self.setOriginalDataStorageFormat(OriginalDataStorageFormat.UNCHANGED) - self.setImageLibrary("BioFormats") - self.setRecognizedImageExtensions(['lsm', 'stk', 'lif', 'nd2', 'gel', 'tiff']) - self.setGenerateThumbnails(True) - - self.setUseImageMagicToGenerateThumbnails(True) - -# self.setGenerateHighQuality8BitThumbnails(False) - self.addGeneratedImageRepresentationWithResolution("1000x1000") - self.addGeneratedImageRepresentationWithResolution("250x250") - self.setImageGenerationAlgorithm( - MaximumIntensityProjectionGenerationAlgorithm("ELN_PREVIEW", 250, 250,"thumbnail.png").useThumbnails()) - - def createChannel(self, channelCode): - """Create a channel from the channelCode with the name as read from - the file via the MetadataReader. - - @param channelCode Code of the channel as generated by extractImagesMetadata(). - """ - - # Get the indices of series and channel from the channel code - (seriesIndx, channelIndx) = self._getSeriesAndChannelNumbers(channelCode) - - if seriesIndx != self._seriesNum: - return - - # Try extracting the channel colors for the given series - try: - channelNames = self._metadataReader.getMetadata()[seriesIndx]['channelNames'] - except IndexError: - raise("Could not channel name for series " + str(seriesIndx) + " from MetadataReader.") - - # Try extracting the name - try: - name = channelNames[channelIndx] - except: - raise("Could not extract name with index " + channelIndx) - - # In case no name was found, assign default name - if name == "": - name = "No name" - - # Return the color - return Channel(channelCode, name, self._getChannelColorRGB(channelCode)) - - - def extractImagesMetadata(self, imagePath, imageIdentifiers): - """Overrides extractImagesMetadata method making sure to store - both series and channel indices in the channel code to be reused - later to extract color information and other metadata. - - The channel code is in the form SERIES-(\d+)_CHANNEL-(\d+). - - Only metadata for the relevant series number is returned! - - @param imagePath Full path to the file to process - @param imageIdentifiers Array of ImageIdentifier's - - @see constructor. - """ - - # Initialize array of metadata entries - metaData = [] - - # Iterate over all image identifiers - for id in imageIdentifiers: - - # Extract the info from the image identifier - ch = id.colorChannelIndex - plane = id.focalPlaneIndex - series = id.seriesIndex - timepoint = id.timeSeriesIndex - - # Make sure to process only the relevant series - if series != self._seriesNum: - continue - - # Build the channel code - channelCode = "SERIES-" + str(series) + "_CHANNEL-" + str(ch) - - # Initialize a new ImageMetadata object - imageMetadata = ImageMetadata(); - - # Fill in all information - imageMetadata.imageIdentifier = id - imageMetadata.seriesNumber = series - imageMetadata.timepoint = timepoint - imageMetadata.depth = plane - imageMetadata.channelCode = channelCode - imageMetadata.well = "IGNORED" - imageMetadata.tileNumber = 1 - - # Append metadata for current image - metaData.append(imageMetadata) - return metaData - - - def _getChannelColorRGB(self, channelCode): - """Returns a ChannelColorRGB instantiated with the RGB color components - extracted from the file by the MetadataReader. - - @param channelCode Code of the channel as generated by extractImagesMetadata(). - """ - - # Get the indices of series and channel from the channel code - (seriesIndx, channelIndx) = self._getSeriesAndChannelNumbers(channelCode) - - if seriesIndx != self._seriesNum: - return - - # Try extracting the channel colors for the given series - try: - channelColors = \ - self._metadataReader.getMetadata()[seriesIndx]['channelColors'] - except IndexError: - raise("Could not extract channel colors for series " + str(seriesIndx) + " from MetadataReader.") - - # Try extracting the color - try: - color = channelColors[channelIndx] - R = color[0] - G = color[1] - B = color[2] - print "Channel: %s, Color: %s" % (channelCode, color) - except: - raise("Could not extract color with index " + channelIndx) - - return ChannelColorRGB(R, G, B) - - - def _getSeriesAndChannelNumbers(self, channelCode): - """Extract series and channel number from channel code in - the form SERIES-(\d+)_CHANNEL-(\d+) to a tuple - (seriesIndx, channelIndx). - - @param channelCode Code of the channel as generated by extractImagesMetadata(). - """ - - # Get the indices of series and channel from the channel code - p = re.compile("SERIES-(\d+)_CHANNEL-(\d+)") - m = p.match(channelCode) - if m is None or len(m.groups()) != 2: - raise Exception("Could not extract series and channel number!") - - # Now assign the indices - seriesIndx = int(m.group(1)) - channelIndx = int(m.group(2)) - - # Return them - return seriesIndx, channelIndx diff --git a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/plugin.properties b/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/plugin.properties deleted file mode 100644 index bfad624bbb24dbbaad6a1aebdcc9da82eb31134f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -#incoming-dir = ${incoming-root-dir}/ias_typhoon/openbis6000user_folder_test -#incoming-dir = ${incoming-root-dir}/incoming-typhoon -incoming-dir = /home/openbis/sonas_share_02/ias_typhoon/openbis6000user_folder_test/ -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.openbis.dss.etl.jython.v2.JythonPlateDataSetHandlerV2 -script-path = simple-microscopy-dropbox.py -storage-processor = ch.systemsx.cisd.openbis.dss.etl.MicroscopyStorageProcessor -storage-processor.data-source = imaging-db -#incoming-share-id=2 -preferred-share-id=1 \ No newline at end of file diff --git a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/simple-microscopy-dropbox.py b/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/simple-microscopy-dropbox.py deleted file mode 100644 index 6bbd20188e84f27e64136225517fcc04eeae75a1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/gruissem-typhoon-dropbox/1/dss/drop-boxes/gruissem-typhoon-dropbox/simple-microscopy-dropbox.py +++ /dev/null @@ -1,91 +0,0 @@ -import os -import time -from ch.systemsx.cisd.openbis.dss.etl.dto.api import SimpleImageDataConfig -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ImageMetadata -from ch.systemsx.cisd.openbis.dss.etl.dto.api import ChannelColor -from BioFormatsProcessor import BioFormatsProcessor -from MicroscopySingleDatasetConfig import MicroscopySingleDatasetConfig - -SPACE_CODE = "TYPHOON" -PROJECT_CODE = "TYPHOON" -PROJECT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s" % vars() -EXPERIMENT_CODE = "TYPHOON_INCOMING" -EXPERIMENT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s/%(EXPERIMENT_CODE)s" % vars() - -#SAMPLE_CODE = "SERIES1" -#SAMPLE_ID = "/%(SPACE_CODE)s/%(SAMPLE_CODE)s" % vars() -#path_name, fileExtension = os.path.splitext(incoming.getPath()) -#SAMPLE_CODE = path_name -#SAMPLE_ID = "/%(SPACE_CODE)s/%(SAMPLE_CODE)s" % vars() - - -def create_space_if_needed(transaction): - space = transaction.getSpace(SPACE_CODE) - if None == space: - space = transaction.createNewSpace(SPACE_CODE, None) - space.setDescription("A demo space") - -def create_project_if_needed(transaction): - project = transaction.getProject(PROJECT_ID) - if None == project: - create_space_if_needed(transaction) - project = transaction.createNewProject(PROJECT_ID) - project.setDescription("A demo project") - -def create_experiment_if_needed(transaction): - """ Get the specified experiment or register it if necessary """ - exp = transaction.getExperiment(EXPERIMENT_ID) - if None == exp: - create_project_if_needed(transaction) - print 'Creating new experiment : ' + EXPERIMENT_ID - exp = transaction.createNewExperiment(EXPERIMENT_ID, 'TYPHOON') - - return exp - -def create_sample_if_needed(transaction): - """ Get the specified sample or register it if necessary """ - - incoming = transaction.getIncoming() - path_name = os.path.basename(incoming.getPath()) - SAMPLE_CODE = os.path.splitext(path_name)[0] - SPACE_CODE = "TYPHOON" - MILLIS = int(round(time.time() * 1000)) - SAMPLE_ID = "/%(SPACE_CODE)s/%(SAMPLE_CODE)s-%(MILLIS)s" % vars() - - print SAMPLE_ID - - samp = transaction.getSample(SAMPLE_ID) - - if None == samp: - exp = create_experiment_if_needed(transaction) - samp = transaction.createNewSample(SAMPLE_ID, 'TYPHOON_IMG') - samp.setExperiment(exp) - - return samp - - -def printMetaData(metaDataReader): - num_series = metaDataReader.getNumSeries() - - print "Meta data: number of series: %s" % num_series - for i in range(num_series): - metadata = metaDataReader.getMetadata()[i] - print " meta data for series %s:" % i - for k in metadata: - print " %s = %s" % (k, metadata[k]) - - -def process(transaction): - incoming = transaction.getIncoming() - metaDataReader = BioFormatsProcessor(incoming) - metaDataReader.extractMetadata() - printMetaData(metaDataReader) - imageDatasetConfig = MicroscopySingleDatasetConfig(metaDataReader) - sample = create_sample_if_needed(transaction) - containerDataset = transaction.createNewImageDataSet(imageDatasetConfig, incoming) - containerDataset.setSample(sample) - thumbnailDatasets = containerDataset.getThumbnailDatasets() - for thumbnailDataset in thumbnailDatasets: - if thumbnailDataset.getDataSetType() == "ELN_PREVIEW": - thumbnailDataset.getRegistrationDetails().getDataSetInformation().setLinkSample(True) - transaction.moveFile(incoming.getPath(), containerDataset) diff --git a/plasmid/source/core-plugins/pankemigration/1/as/definitions.py b/plasmid/source/core-plugins/pankemigration/1/as/definitions.py deleted file mode 100644 index 9e82f9c468d56d5e6c3f51d95e1bc780c3f09d48..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/as/definitions.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Documentation -## -## Properties starting by "+" will be created in openBIS, but will not be read from FileMaker but if set programmatically will be put back in openBIS. -## Properties starting by "-" will not be created in openBIS but will be read from FileMaker. - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -annotationsScriptName="ANNOTATIONS" -geneticModificationsScriptName = "GENETIC_MODIFICATIONS"; - -seqFileDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", "COMMENTS_DATA_SET", None,False] -]; - - -# -#Sample Types -# - - -strainDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "", None, None, False], - ["BBPL_NUM", "General", "bBPL Number", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID", "General", "Plasmid", DataType.VARCHAR, None, "", None, None, False], - ["GENOTYPE", "General", "Genotype", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SOURCE", "General", "Source", DataType.VARCHAR, None, "", None, None, False], - ["DEPOSITOR", "General", "Depositor", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["REFERENCE", "General", "Reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["OTHER_COLLECTION_NUMBER", "General", "Other Collection Number", DataType.VARCHAR, None, "", None, None, False], - ["MEDIUM", "General", "Medium", DataType.VARCHAR, None, "", None, None, False], - ["RESISTANCE", "General", "Resistance", DataType.VARCHAR, None, "", None, None, False], - ["REMARKS", "General", "Application/Remarks", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["DATE", "General", "Date", DataType.TIMESTAMP, None, "", None, None, False], - ["OTHER", "General", "Other", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["-BPL_NUMBER", "General", "BPL Number", DataType.VARCHAR, None, "", None, None, False], - ["+GENETIC_MODIFICATIONS", "Genotype", "Genetic modifications", DataType.MULTILINE_VARCHAR, None, "", None, geneticModificationsScriptName, False], - ["+STORAGE_NAMES", "Physical Storage", "Storage Name", DataType.CONTROLLEDVOCABULARY, "STORAGE_NAMES", "Storage Name", None, None, False], - ["+STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["+STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "Box", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["+STORAGE_BOX_SIZE", "Physical Storage", "Storage Box Size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box Size", None, None, False], - ["+STORAGE_USER", "Physical Storage", "Storage User Id", DataType.VARCHAR, None, "Storage User Id", None, None, False], - ["STORAGE_POSITION", "Physical Storage", "Location", DataType.VARCHAR, None, "Storage Position", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", " Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -oligoDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "", None, None, False], - ["DESCRIPTION", "General", "Description", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["DEPOSITOR", "General", "Depositor", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["DATE", "General", "Date", DataType.TIMESTAMP, None, "", None, None, False], - ["REMARKS", "General", "Application/Remarks", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SEQUENCE", "General", "Sequence", DataType.VARCHAR, None, "", None, None, False], - ["ALTERNATE_OL_NAME", "General", "Alternate Oligo Name", DataType.VARCHAR, None, "", None, None, False], - ["OBPL_NUMBER", "General", "oBPL Number", DataType.VARCHAR, None, "", None, None, False], - ["+STORAGE_NAMES", "Physical Storage", "Storage Name", DataType.CONTROLLEDVOCABULARY, "STORAGE_NAMES", "Storage Name", None, None, False], - ["+STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["+STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "Box", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["+STORAGE_BOX_SIZE", "Physical Storage", "Storage Box Size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box Size", None, None, False], - ["+STORAGE_USER", "Physical Storage", "Storage User Id", DataType.VARCHAR, None, "Storage User Id", None, None, False], - ["STORAGE_POSITION", "Physical Storage", "Location", DataType.VARCHAR, None, "Storage Position", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", " Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - -plasmidDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "", None, None, False], - ["DESCRIPTION", "General", "Description", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["SOURCE", "General", "Source", DataType.VARCHAR, None, "", None, None, False], - ["DEPOSITOR", "General", "Depositor", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["DATE", "General", "Date", DataType.TIMESTAMP, None, "", None, None, False], - ["REFERENCE", "General", "Reference", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], - ["RESISTANCE", "General", "Resistance", DataType.VARCHAR, None, "", None, None, False], - ["REMARKS", "General", "Application/Remarks", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["ALTERNATE_PL_NUMBER", "General", "Alternate Plasmid Number", DataType.VARCHAR, None, "", None, None, False], - ["PL_NUMBER", "General", "Plasmid Number", DataType.INTEGER, None, "", None, None, False], - ["ORIGIN", "General", "Origin", DataType.VARCHAR, None, "", None, None, False], - ["VERIFIED_BY", "General", "Verified by:", DataType.VARCHAR, None, "", None, None, False], - ["VERIFIED_BY_2", "General", "Verified by 2", DataType.VARCHAR, None, "", None, None, False], - ["VERIFIED_BY_3", "General", "Verified by 3", DataType.VARCHAR, None, "", None, None, False], - ["VERIFIED_BY_4", "General", "Verified by 4", DataType.VARCHAR, None, "", None, None, False], - ["GLYCEROL", "General", "Glycerol", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER", "General", "Promoter", DataType.VARCHAR, None, "", None, None, False], - ["-SEQUENCE", "General", "Sequence", DataType.VARCHAR, None, "", None, None, False], - ["+STORAGE_NAMES", "Physical Storage", "Storage Name", DataType.CONTROLLEDVOCABULARY, "STORAGE_NAMES", "Storage Name", None, None, False], - ["+STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["+STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "Box", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["+STORAGE_BOX_SIZE", "Physical Storage", "Storage Box Size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box Size", None, None, False], - ["+STORAGE_USER", "Physical Storage", "Storage User Id", DataType.VARCHAR, None, "Storage User Id", None, None, False], - ["STORAGE_POSITION", "Physical Storage", "Location", DataType.VARCHAR, None, "Storage Position", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", " Annotations State", DataType.XML, None,"Annotations State", annotationsScriptName, None, False] -]; - - diff --git a/plasmid/source/core-plugins/pankemigration/1/as/definitionsVoc.py b/plasmid/source/core-plugins/pankemigration/1/as/definitionsVoc.py deleted file mode 100644 index ed5783d05f2a4f04769d5b0f2eb6a7bd15fd4fd4..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/as/definitionsVoc.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "LAB_MEMBERS": [ - ["TANIA_ROBERTS", "Tania Roberts"], - ["Andreas_Meyer", "Andreas Meyer"], - ["Sonja_Billerbeck", "Sonja Billerbeck"], - ["Marcel_Walser", "Marcel Walser"], - ["Angelika_Ress", "Angelika Ress"], - ["Andreas_Bosshart", "Andreas Bosshart"], - ["Alex_Nilsson", "Alex Nilsson"], - ["Matthias_Bujara", "Matthias Bujara"], - ["Michael_Eichenberger", "Michael Eichenberger"], - ["Jaroslav_Michalko", "Jaroslav Michalko"], - ["Sven_Panke", "Sven Panke"], - ["Giorgia_Valesia", "Giorgia Valesia"], - ["Stefan", "Stefan"], - ["Sonja_Billerback", "Sonja Billerback"], - ["Johannes_Haerle", "Johannes Haerle"], - ["Alexandra_Schulz", "Alexandra Schulz"], - ["Diana_Ostos_Rangel", "Diana Ostos Rangel"], - ["Sabine_Oesterle", "Sabine Österle"], - ["Katja_Becker", "Katja Becker"] - - ], - "STORAGE_NAMES": [ - ["BENCH", "Bench"], - ["DEFAULT_STORAGE", "Default Storage"] - ], - - - "STORAGE_BOX_SIZE": [ - ["1X1", "1 x 1 box"], - ["4X4", "4 x 4 box"], - ["20X40", "20 x 40 box"] - ] - - - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/as/initialize-master-data.py b/plasmid/source/core-plugins/pankemigration/1/as/initialize-master-data.py deleted file mode 100644 index 8f659d2f93e551eb7689ecd8d1abaa1c7f816af9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/as/initialize-master-data.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -## -## Configuration -## -#PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/juanf/Documents/workspace/openbis/source/core-plugins/petermigration/1/compatibility/"; -PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/barillac/openbis-panke/servers/core-plugins/filemaker_migration/1/compatibility/"; - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.createNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - -def createDataSetTypeWithProperties(dataSetCode, description, properties): - newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); - newDataSet.setDescription(description); - addProperties(newDataSet, properties); - -def createExperimentTypeWithProperties(experimentTypeCode, description, properties): - newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); - newExperiment.setDescription(description); - addProperties(newExperiment, properties); - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = samplesCache[sampleTypeCode]; - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - propertyCode = property[0]; - if propertyCode.startswith("-"): - continue - elif propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - - addProperty(entity, propertyCode, property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8]); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); - propertyAssignment.setSection(section); - propertyAssignment.setMandatory(isMandatory); - propertyAssignment.setShownEdit(True); - - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(False); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION -def createScript(path, name, description, scriptType, entityType): - scriptAsString = open(path, 'r').read(); - script = tr.getOrCreateNewScript(name); - script.setName(name); - script.setDescription(description); - script.setScript(scriptAsString); - script.setScriptType(scriptType); - script.setEntityForScript(entityType); - return script; - - -def createAnnotationsScriptForType(sampleTypeCode): - annotationsScriptName = None; - if PATH_TO_MANAGE_PROPERTIES_SCRIPTS != None: - annotationsScriptName = "ANNOTATIONS_" + sampleTypeCode; - annotationsScriptAsString = open(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "managed.py", 'r').read(); - annotationsScriptAsString = annotationsScriptAsString.replace("<REPLACE_WITH_ANNOTABLE_TYPE>", sampleTypeCode); - annotationsScript = tr.getOrCreateNewScript(annotationsScriptName); - annotationsScript.setName(annotationsScriptName); - annotationsScript.setDescription("Annotations Handler for " + sampleTypeCode); - annotationsScript.setScript(annotationsScriptAsString); - annotationsScript.setScriptType("MANAGED_PROPERTY"); - annotationsScript.setEntityForScript("SAMPLE"); - return annotationsScriptName; -## -## Managed properties scripts -## -commentsScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "comments.py", - definitions.commentsScriptName, - "Comments Handler", - "MANAGED_PROPERTY", - "SAMPLE"); - -## -## Dynamic properties scripts -## - - -geneticModificationsScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "genetic_modifications.py", - definitions.geneticModificationsScriptName, - "genetic modifications", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - - - - -## -## Vocabulary Types -## -for vocabularyCode, vocabularyValues in definitionsVoc.vocabularyDefinitions.iteritems(): - createVocabularyWithTerms(vocabularyCode, vocabularyValues) - -## -## Experiment Types -## -#createExperimentTypeWithProperties("DEFAULT_EXPERIMENT", "Default Experiment", definitions.experimentDefinition); -#createExperimentTypeWithProperties("MATERIAL", "FOLDER FOR ORGANIZING MATERIALS SAMPLES", []); -#createExperimentTypeWithProperties("METHOD", "FOLDER FOR ORGANIZING METHODS SAMPLES", []); - -#createDatasetTypeWithProperties("SEQ_FILE", "Sequence fasta files", []); -createDataSetTypeWithProperties("SEQ_FILE", "Sequence fasta files", definitions.seqFileDefinition); - -## -## Sample Types -## -annotationsScriptName = createAnnotationsScriptForType("STRAIN"); -createSampleTypeWithProperties("STRAIN", "", definitions.strainDefinition); -#=================================================================================================== -annotationsScriptName = createAnnotationsScriptForType("PLASMID"); -createSampleTypeWithProperties("PLASMID", "", definitions.plasmidDefinition); -annotationsScriptName = createAnnotationsScriptForType("OLIGO"); -createSampleTypeWithProperties("OLIGO", "", definitions.oligoDefinition); - -#=================================================================================================== - - - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/compatibility/comments.py b/plasmid/source/core-plugins/pankemigration/1/compatibility/comments.py deleted file mode 100644 index 02c50d2364afd8bf0dce2d50297c6bff2ccb35bf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/compatibility/comments.py +++ /dev/null @@ -1,174 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [COMMENT_ENTRY_ELEMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - comment_text_list = item.get('COMMENTENTRY') - sampleLink = _createCommentEntry(comment_text_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/source/core-plugins/pankemigration/1/compatibility/genetic_modifications.py b/plasmid/source/core-plugins/pankemigration/1/compatibility/genetic_modifications.py deleted file mode 100644 index b91679ab633450063cacdf52d6c25a0665026535..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/compatibility/genetic_modifications.py +++ /dev/null @@ -1,97 +0,0 @@ -import xml.dom.minidom -from ch.systemsx.cisd.common.exceptions import UserFailureException - -configuration = {} -configuration["YEAST"] = ["PLASMID"] -configuration["BACTERIA"] = ["PLASMID"] -configuration["CELL_LINE"] = ["PLASMID"] -configuration["FLY"] = ["PLASMID"] - -def getSampleTypeCode(sampleAdaptor): - return sampleAdaptor.samplePE().getSampleType().getCode() - -def calculate(): - #Configuration - sampleTypeCode = getSampleTypeCode(entity) - typesForGenotype = configuration[sampleTypeCode] - - genotypeResult = "" - isFirst = True - parentIterables = [{ - "child" : entity, - "parents" : entity.parents(), - "lost" : [] - }] - - while len(parentIterables) > 0: - parentGroup = parentIterables.pop(0) - parents = parentGroup["parents"] - child = parentGroup["child"] - lostList = parentGroup["lost"][:] - - newLostList = [] - newParentIterables = [] - for parent in parents: - parentTypeCode = getSampleTypeCode(parent) - if parentTypeCode in typesForGenotype: - parentCode = parent.code() - #Add the code - annotationMap = getAnnotationsForParent(parent, child) - if(annotationMap["PLASMID_RELATIONSHIP"] == "LOT"): - newLostList.append(parent.entityPE().getPermId()) - elif parent.entityPE().getPermId() not in lostList: - #Check if is the first to add the separator or not - if isFirst: - isFirst = False - else: - genotypeResult = genotypeResult + "\n" - genotypeResult = genotypeResult + parent.code() + " " + getAnnotationString(annotationMap) - else: - newParentIterables.append({ - "child" : parent, - "parents" : parent.parents() - }) - for newParentIterable in newParentIterables: - lostList.extend(newLostList); - newParentIterable["lost"] = lostList; - parentIterables.append(newParentIterable); - return genotypeResult - -def getAnnotationString(annotationMap): - return annotationMap["PLASMID_RELATIONSHIP"] + " " + annotationMap["PLASMID_ANNOTATION"] - -def getAnnotationsForParent(parent, child): - permId = parent.entityPE().getPermId() - annotations = child.propertyValue("ANNOTATIONS_STATE") - if (annotations is not None) and ('<root' in annotations): - relationshipValue = getAnnotationFromPermId(annotations, permId, "PLASMID_RELATIONSHIP") - if relationshipValue is None: - relationshipValue = "None" - annotationValue = getAnnotationFromPermId(annotations, permId, "PLASMID_ANNOTATION"); - if annotationValue is None: - annotationValue = "" - annotation = "\"" + str(annotationValue) + "\"" - return {"PLASMID_RELATIONSHIP" : str(relationshipValue), "PLASMID_ANNOTATION" : str(annotation)}; - return "No Annotations Found" - -def getAnnotationFromPermId(annotations, permId, key): - dom = xml.dom.minidom.parseString(annotations) - for child in dom.childNodes[0].childNodes: - if child.localName != None: - permIdFound = child.attributes["permId"].value - if permIdFound == permId: - keys = child.attributes.keys(); - for keyFound in keys: - if keyFound == key: - return child.attributes[key].value - return None - -def getValueOrNull(map, key): - if key in map: - value = map[key] - if not value: #Check for null strings - return None - else: - return value - else: - return None \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/compatibility/managed.py b/plasmid/source/core-plugins/pankemigration/1/compatibility/managed.py deleted file mode 100644 index 6d6312c0f92b6c8bcc7e59032b5bbad4d7005858..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/compatibility/managed.py +++ /dev/null @@ -1,331 +0,0 @@ -from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider - -## -## Configuration -## - -# This needs to be edited for each sample type to match the Profile.js ANNOTATION_PROPERTIES map. -configuration = {} -configuration["MEDIA"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["SOLUTION_BUFFER"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["GENERAL_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False } - }; - -configuration["PCR_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["WESTERN_BLOTTING_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["PLASMID"] = { - "PLASMID" : {"COMMENTS" : False } - }; - -configuration["BACTERIA"] = { - "BACTERIA" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["YEAST"] = { - "YEAST" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False, "CONTAINED" : False } - }; - -configuration["CELL_LINE"] = { - "CELL_LINE" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False } - }; - -configuration["FLY"] = { - "FLY" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["EXPERIMENTAL_STEP"] = { - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False }, - "BACTERIA" : {"COMMENTS" : False }, - "CELL_LINE" : {"COMMENTS" : False }, - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "OLIGO" : {"COMMENTS" : False }, - "PLASMID" : {"COMMENTS" : False }, - "RNA" : {"COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "YEAST" : {"COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False }, - "PCR_PROTOCOL" : {"COMMENTS" : False }, - "WESTERN_BLOTTING_PROTOCOL" : {"COMMENTS" : False } - }; - -configurationCopyParents = {} -configurationCopyParents["YEAST"] = { "YEAST" : "PLASMID" }; - -#Global Variables -annotableType = "<REPLACE_WITH_ANNOTABLE_TYPE>" -propertyTypes = None -def getPropertyTypes(): - global propertyTypes - if propertyTypes is None: - server = CommonServiceProvider.getCommonServer() - contextOrNull = server.tryToAuthenticateAsSystem() - propertyTypes = server.listPropertyTypes(contextOrNull.getSessionToken(), False) - return propertyTypes; - -## -## Help Methods -## -def getAllAnnotableSampleTypesForType(fromAnnotableType): - allTypes = {}; - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - allTypes[sampleTypeWithAnnotationsForType] = True; - return allTypes; - -def getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCodeToFind, fromAnnotableType): - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - if sampleTypeWithAnnotationsForType == sampleTypeCodeToFind: - return configuration[sampleTypeWithAnnotations][sampleTypeWithAnnotationsForType]; - return None; - -def getPropertyType(propertyTypeCode): - for propertyType in getPropertyTypes(): - if propertyType.code == propertyTypeCode: - return propertyType - return None; - -def createAnnotationsFor(identifier, annotations, sampleType): - permId = entityInformationProvider().getSamplePermId(identifier); - newAnnotation = elementFactory().createSampleLink(permId) - - newAnnotation.addAttribute("identifier", identifier) - newAnnotation.addAttribute("sampleType", sampleType) - for annotation in annotations: - newAnnotation.addAttribute(annotation, annotations[annotation]) - return newAnnotation - -def getWidgetForAdd(sampleTypeCode, annotableType): - #print "sampleTypeCode:" + sampleTypeCode + " - " + annotableType #Deleting this comment causes the thing to break - widgets = [] - widgetIdentifier = inputWidgetFactory().createTextInputField("identifier")\ - .setMandatory(True)\ - .setValue("")\ - .setDescription("") - widgets.append(widgetIdentifier) - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - widget = inputWidgetFactory().createTextInputField(propertyType.label)\ - .setMandatory(getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType)[propertyTypeCode])\ - .setValue("")\ - .setDescription(propertyType.description) - widgets.append(widget) - return widgets; - -def isValid(dataType, value): - return True - -## -## Registration form (EXPERIMENTAL) -## - -# def inputWidgets(): -# print "EXECUTING inputWidgets START" -# widgetsToCopyFrom = [] -# if annotableType in configurationCopyParents: -# toCopyFrom = configurationCopyParents[annotableType] -# if(toCopyFrom is not None): -# for key in toCopyFrom: -# widgetLabel = key + " to copy " + toCopyFrom[key] -# print "EXECUTING inputWidgets key: " + widgetLabel -# widgetToCopyFrom = inputWidgetFactory().createTextInputField(widgetLabel).setMandatory(False) -# widgetsToCopyFrom.append(widgetToCopyFrom) -# print "EXECUTING inputWidgets " + str(len(widgetsToCopyFrom)) -# return widgetsToCopyFrom -# -# def updateFromRegistrationForm(bindings): -# print "EXECUTING updateFromaRegistrationForm" -# for key in bindings: -# print "MANAGED WITH KEY: " + str(key) - -## -## Main Methods -## -def configureUI(): - # Add Headers - tableBuilder = createTableBuilder() - tableBuilder.addHeader("identifier") - tableBuilder.addHeader("sampleType") - tableBuilder.addHeader("name") - - usedTableHeaders = {"identifier" : True, "sampleType" : True, "name" : True } - - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - if propertyTypeCode not in usedTableHeaders: - tableBuilder.addHeader(propertyTypeCode) - usedTableHeaders[propertyTypeCode] = True - - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - # Add Rows - samples = list(propertyConverter().convertToElements(property)) - for sample in samples: - row = tableBuilder.addRow() - permId = sample.getAttribute("permId") - - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "NAME") - if nameValue is not None: - row.setCell("name", nameValue) - - for annotation in sample.getAttributes(): - if annotation != "permId": - if annotation == "identifier": - row.setCell(annotation, sample, sample.getAttribute(annotation)) - else: - row.setCell(annotation, sample.getAttribute(annotation)) - - # Add Create buttons - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - title = "Add " + sampleTypeCode; - addAction = uiDescription.addTableAction(title).setDescription(title) - widgets = getWidgetForAdd(sampleTypeCode, annotableType) - addAction.addInputWidgets(widgets) - - # TO-DO Edit button for each type with different hooks to the columns depending on the type - # Add Edit Button (EXPERIMENTAL) -# editAction = uiDescription.addTableAction('Edit').setDescription('Edit selected table row') -# editAction.setRowSelectionRequiredSingle() -# editWidgets = [] -# for headerKey in usedTableHeaders: -# editWidgets.append(inputWidgetFactory().createTextInputField(headerKey)) -# editAction.addBinding(headerKey, headerKey) -# editAction.addInputWidgets(editWidgets) - - # Add Delete button - deleteAction = uiDescription.addTableAction("Delete")\ - .setDescription('Are you sure you want to delete selected annotation?') - deleteAction.setRowSelectionRequired() # Delete is enabled when at least 1 row is selected. - -def updateFromUI(action): - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - if action.name.startswith("Add"): - sampleTypeCode = action.name[4:] - identifier = action.getInputValue("identifier") - annotations = { } - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - propertyTypeValue = action.getInputValue(propertyType.label) - if not isValid(propertyType.dataType, propertyTypeValue): - raise ValidationException("Property " + str(propertyType.label) + " with invalid value " + str(propertyTypeValue)) - if propertyTypeValue is None: - propertyTypeValue = "" - annotations[propertyTypeCode] = propertyTypeValue - newAnnotation = createAnnotationsFor(identifier, annotations, sampleTypeCode) - elements.append(newAnnotation) - - if action.name.startswith("Delete"): - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - - property.value = converter.convertToString(elements) - -## -## Batch Import Methods -## -def batchColumnNames(): - allTypes = [] - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - allTypes.append(sampleTypeCode) - return allTypes - -def updateFromBatchInput(bindings): - #print "--------> UPDATE FROM BATCH INPUT: " - elements = [] - - #Links Configuration - typesToCopyFrom = [] - if annotableType in configurationCopyParents: - typesToCopyFrom = configurationCopyParents[annotableType] - - for annotableSampleType in getAllAnnotableSampleTypesForType(annotableType): - annotatedSamples = bindings.get(annotableSampleType) - #print "-----> TYPE: " + str(annotableSampleType) + " BINDINGS: " + str(annotatedSamples) - if (annotatedSamples != None and annotatedSamples != ""): - #Annotations - #print "-----> Annotations" - if annotableSampleType not in typesToCopyFrom: - for sampleLine in annotatedSamples.split("\\"): - propertyTypes = getPropertyTypesForSampleTypeFromAnnotableType(annotableSampleType, annotableType) - identifier = None - permId = None - sampleLink = None - for sampleProperty in sampleLine.split(";"): - propertyName = sampleProperty.split(":")[0] - propertyValue = sampleProperty.split(":")[1] - if propertyName == "identifier": - identifier = propertyValue - permId = entityInformationProvider().getSamplePermId(propertyValue) - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(propertyName, propertyValue) - sampleLink.addAttribute('sampleType', annotableSampleType) - elif propertyName in propertyTypes: - sampleLink.addAttribute(propertyName, propertyValue) - else: - raise NameError('Found invalid property: ' + propertyName + " on type " + annotableSampleType) - if identifier is not None: - elements.append(sampleLink) - #Links - #print "-----> links" - for typeToCopyFrom in typesToCopyFrom: - typeToCopy = typesToCopyFrom[typeToCopyFrom] - #print "-----> TYPE TO COPY FROM: " + str(typeToCopyFrom) - #print "-----> TYPE TO COPY: " + str(typeToCopy) - identifiersToCopyFrom = bindings.get(typeToCopyFrom) - if identifiersToCopyFrom is not None: - #print "-----> IDENTIFIERS TO COPY FROM: " + str(identifiersToCopyFrom) - identifiersForCopy = identifiersToCopyFrom.split(',') - for identifierToCopyFrom in identifiersForCopy: - #print "-----> IDENTIFIER TO COPY FROM: " + str(identifierToCopyFrom) - permIdFromIdentifier = entityInformationProvider().getSamplePermId(identifierToCopyFrom) - #print "-----> PERMID TO COPY FROM: " + str(permIdFromIdentifier) - parentsToCopyFromPermId = entityInformationProvider().getSamplePropertyValue(permIdFromIdentifier, "ANNOTATIONS_STATE") - #print "-----> ELEMENTS TO COPY: " + str(parentsToCopyFromPermId) - parentElements = list(propertyConverter().convertStringToElements(parentsToCopyFromPermId)) - for parentAnnotation in parentElements: - if parentAnnotation.getAttribute("sampleType") == typeToCopy: - parentAnnotation.addAttribute("CONTAINED", identifierToCopyFrom) - #print "-----> COPYING: " + str(parentAnnotation.getAttribute('identifier')) - elements.append(parentAnnotation) - property.value = propertyConverter().convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitions.py b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitions.py deleted file mode 100644 index 67f4986e22a26dc0aed0b7262676b19cb2e559b2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitions.py +++ /dev/null @@ -1,374 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -adenosineScriptName = "ADENOSINE_COUNT" -cytosineScriptName= "CYTOSINE_COUNT" -gcScriptName= "GC" -guanosineScriptName= "GUANOSINE_COUNT" -lengthScriptName= "SEQUENCE_LENGTH" -nucelotideScriptName= "ONUCLEOTIDE_COUNT" -thymidineScriptName= "THYMIDINE_COUNT" -tmScriptName= "TM" - -# -# Storage -# -numberOfStorageGroups = 65 - -def getStorageGroupPropertyCodes(): - propertyCodes = []; - for property in getStorageGroupDefinition(): - propertyCodes.append(property[0]); - return propertyCodes; - -def getStorageGroupDefinition(): - return [ - ["STORAGE_NAME", "Physical Storage", "location", DataType.CONTROLLEDVOCABULARY, "FREEZER", "Storage Name", None, None, False], - ["STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "box label", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["STORAGE_USER", "Physical Storage", "frozen by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "Storage User Id", None, None, False], - ["STORAGE_BOX_POSITION", "Physical Storage", "position", DataType.VARCHAR, None, "Storage Box Position", None, None, False] -]; - -# -# Experiment Types -# -experimentDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], - ["GRANT", "General", "Grant", DataType.VARCHAR, None, "grant name", None, None, False], - ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], - ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], - ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] -]; - -# -# Sample Types -# -antibodyDefinition = [ - ["NAME", "General", "antibody ID", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_ID_NR", "General", "antibody_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ANTIGEN", "General", "antigen", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_BLOCK", "General", "block facs", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_IF_BLOCK", "General", "block IFF", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_WB_BLOCK", "General", "block western", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["CATALOGUE_NUMBER", "General", "catalog id #", DataType.VARCHAR, None, "", None, None, False], - ["CLASS", "General", "class", DataType.CONTROLLEDVOCABULARY, "CLASS", "", None, None, False], - ["CLONE", "General", "clone", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ANTIBODY_FACS_CONC", "General", "conc facs", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IF_CONC", "General", "conc IFF", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IP_CONC", "General", "conc ip", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_IP", "", None, None, False], - ["ANTIBODY_WB_CONC", "General", "conc western", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_WESTERN", "", None, None, False], - ["ANTIBODY_CONCENTRATION", "General", "concentration", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_CROSSREACTIVITY", "General", "crossreactivity", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_FIX", "General", "fix facs", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_IF_FIX", "General", "fix IFF", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_WB_FIX", "General", "fix western", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LABEL", "General", "label", DataType.CONTROLLEDVOCABULARY, "LABEL", "", None, None, False], - ["LOTNUMBER", "General", "lotnumber", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MONO_POLYCLONAL", "General", "mono/polyclonal", DataType.CONTROLLEDVOCABULARY, "MONO-POLYCLONAL", "", None, None, False], - ["ANTIBODY_FACS_NOTES", "General", "notes FACS", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IF_NOTES", "General", "notes IFF", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IP_NOTES", "General", "notes IP", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_WB_NOTES", "General", "notes western", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["ANTIGEN_SIZE", "General", "size", DataType.VARCHAR, None, "", None, None, False], - ["SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "SOURCE", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["BOX", "Storage", "box", DataType.VARCHAR, None, "", None, None, False], - ["RACK", "Storage", "rack", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -cellDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR", "General", "cell_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR_COPY", "General", "cell_id_nr Copy", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], - ["CLONE", "General", "clone #", DataType.INTEGER, None, "", None, None, False], - ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC4", "General", "conc.4", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT4", "General", "concentration unit 4", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINE_NAME", "General", "line name", DataType.VARCHAR, None, "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MYCOPLASM_TESTED", "General", "mycoplasm_tested", DataType.BOOLEAN, None, "", None, None, False], - ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERS_CELL_NUMBER", "General", "PersCellNumber", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID4", "General", "sel.4", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], - ["VIRUS_ID1", "General", "virus ID 1", DataType.VARCHAR, None, "", None, None, False], - ["VIRUS_ID2", "General", "virus ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -strainDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["BACKGROUND", "General", "background", DataType.CONTROLLEDVOCABULARY, "STRAIN_BACKGROUND", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CIR", "General", "cir", DataType.CONTROLLEDVOCABULARY, "CIR", "", None, None, False], - ["CONC_INDUCER1", "General", "conc. inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER2", "General", "conc. inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER3", "General", "conc. inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DERIVATION", "General", "derivation", DataType.CONTROLLEDVOCABULARY, "DERIVATION", "", None, None, False], - ["EXPRESSED_PROTEIN1", "General", "expressed protein 1", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN2", "General", "expressed protein 2", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN3", "General", "expressed protein 3", DataType.VARCHAR, None, "", None, None, False], - ["FREE_PLASMID", "General", "freeplasmid", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GAL", "General", "gal", DataType.CONTROLLEDVOCABULARY, "GAL", "", None, None, False], - ["GENE_EXPRESSION1", "General", "gene expression 1", DataType.VARCHAR, None, "", None, None, False], - ["GENE_EXPRESSION2", "General", "gene expression 2", DataType.VARCHAR, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INDUCER1", "General", "inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER2", "General", "inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER3", "General", "inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MARKERS", "General", "markers", DataType.VARCHAR, None, "", None, None, False], - ["MAT", "General", "mat", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NUMBER", "General", "number", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_OBTAINED_FROM", "General", "obtained from", DataType.VARCHAR, None, "", None, None, False], - ["ORF", "General", "orf", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERSYEASTNUMBER", "General", "persyeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PETERYEASTNUMBER", "General", "peteryeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER1", "General", "promoter 1", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER2", "General", "promoter 2", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER3", "General", "promoter 3", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "General", "reference", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION1", "General", "sel.1", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION2", "General", "sel.2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION3", "General", "sel.3", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION", "General", "selection", DataType.CONTROLLEDVOCABULARY, "SELECTION_YEAST", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "STRAIN_SOURCE", "", None, None, False], - ["SPECIES", "General", "species", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_ID_NR", "General", "strain_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "strain ID", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_NAME", "General", "strain name", DataType.VARCHAR, None, "", None, None, False] -]; - -oligoDefinition = [ - ["AMOUNT", "General", "amount", DataType.REAL, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "OLIGO_COMPANY", "", None, None, False], - ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["GRADE", "General", "grade", DataType.CONTROLLEDVOCABULARY, "OLIGO_GRADE", "", None, None, False], - ["COMMENTS", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["OD", "General", "od", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "oligo ID", DataType.INTEGER, None, "", None, None, False], - ["OLIGO_ID_NR", "General", "oligo_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ORDER_DATE", "General", "order date", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "OLIGO_ORGANISM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_PARTNER", "General", "primer partner", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_POSITION", "General", "primer position", DataType.CONTROLLEDVOCABULARY, "PRIMER_POSITION", "", None, None, False], - ["PUBLISHED_IN", "General", "PublishedIn", DataType.VARCHAR, None, "", None, None, False], - ["RESTRICTION_SITE", "General", "restriction site", DataType.CONTROLLEDVOCABULARY, "RESTRICTION", "", None, None, False], - ["SEQUENCE", "General", "sequence", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.VARCHAR, None, "", None, None, False], - ["USAGE", "General", "usage", DataType.CONTROLLEDVOCABULARY, "OLIGO_USAGE", "", None, None, False], - ["ADENOSINE", "Calculated fields", "adenosine", DataType.INTEGER, None, "", adenosineScriptName, None, False], - ["CYTOSINE", "Calculated fields", "cytosine", DataType.INTEGER, None, "", cytosineScriptName, None, False], - ["GUANOSINE", "Calculated fields", "guanosine", DataType.INTEGER, None, "", guanosineScriptName, None, False], - ["THYMIDINE", "Calculated fields", "thymidine", DataType.INTEGER, None, "", thymidineScriptName, None, False], - ["LENGTH", "Calculated fields", "length", DataType.INTEGER, None, "", lengthScriptName, None, False], - ["GC", "Calculated fields", "gc", DataType.REAL, None, "", gcScriptName, None, False], - ["TM", "Calculated fields", "tm", DataType.REAL, None, "", tmScriptName, None, False], - ["O_NUCLEOTIDE", "Calculated fields", "O nucleotide", DataType.INTEGER, None, "", nucelotideScriptName, None, False] -]; - -plasmidDefinition = [ - ["BACKBONE", "General", "backbone", DataType.CONTROLLEDVOCABULARY, "BACKBONE", "", None, None, False], - ["BACKUP_STORAGE", "General", "backup storage", DataType.VARCHAR, None, "", None, None, False], - ["BACTERIAL_HOST", "General", "bacterial host", DataType.CONTROLLEDVOCABULARY, "BACTERIAL_HOST", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["BIOSAFETY_LEVEL", "General", "biosafety level", DataType.CONTROLLEDVOCABULARY, "BIOSAFETY_LEVEL", "", None, None, False], - ["BOXNR", "General", "boxNr", DataType.VARCHAR, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONSTRUCTION_METHOD", "General", "construction method", DataType.VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["CTERMTAG", "General", "Ctermtag", DataType.VARCHAR, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DATE_OF_CONSTRUCTION", "General", "date of construction", DataType.TIMESTAMP, None, "", None, None, False], - ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], - ["ECOLI_STRAIN", "General", "E.coli strain", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT", "General", "excise insert", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT2", "General", "excise insert 2", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["FUNCTIONAL_ELEMENTS_INSERT", "General", "functional elements insert", DataType.VARCHAR, None, "", None, None, False], - ["HYPERCARD_FILE", "General", "hypercard file", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INSERT", "General", "insert", DataType.VARCHAR, None, "", None, None, False], - ["INSERTION_SITE", "General", "insertion site", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINEARIZE", "General", "linearize", DataType.VARCHAR, None, "", None, None, False], - ["MARKER", "General", "Marker", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NAME_OF_PARENTAL_CLONE", "General", "name of parental clone", DataType.VARCHAR, None, "", None, None, False], - ["NAME_OF_VECTOR", "General", "name of vector", DataType.VARCHAR, None, "", None, None, False], - ["NTERMTAG", "General", "Ntermtag", DataType.VARCHAR, None, "", None, None, False], - ["NUCLEOTIDE_SEQUENCE", "General", "nucleotide sequence", DataType.VARCHAR, None, "", None, None, False], - ["OLIGOS_USED", "General", "oligos used", DataType.VARCHAR, None, "", None, None, False], - ["ORGANISM", "General", "organism", DataType.VARCHAR, None, "", None, None, False], - ["ORIGIN_OF_REPLICATION", "General", "origin of replication", DataType.VARCHAR, None, "", None, None, False], - ["OTHER_MARKER", "General", "other marker", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PERSPLASMIDNUM", "General", "persPlasmidnum", DataType.REAL, None, "", None, None, False], - ["PETERPLASMIDNUM", "General", "PeterPlasmidNum", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "plasmid ID", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID_NR", "General", "plasmid_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["PLASMIDNAME", "General", "plasmidname", DataType.VARCHAR, None, "", None, None, False], - ["PRIMERS", "General", "primers", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER", "General", "promoter", DataType.CONTROLLEDVOCABULARY, "PROMOTER", "", None, None, False], - ["SELECTION_IN_BACTERIA", "General", "selection in bacteria", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_BACTERIA", "", None, None, False], - ["SELECTION_IN_EUKARYOTES", "General", "selection in eukaryotes", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_EUKARYOTES", "", None, None, False], - ["SEQUENCE_FILE_NAME", "General", "sequence file name", DataType.VARCHAR, None, "", None, None, False], - ["SEQUENCING_DATE", "General", "sequencing date", DataType.TIMESTAMP, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SHELF", "General", "shelf", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_INSERT", "General", "size insert", DataType.REAL, None, "", None, None, False], - ["SIZE_OF_INSERT", "General", "size of insert", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_VECTOR", "General", "size vector", DataType.REAL, None, "", None, None, False], - ["PLASMID_SOURCE", "General", "source", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "PLASMID_ORGANISM", "", None, None, False], - #["TUBES", "General", "TUBES", DataType.VARCHAR, None, "", None, None, False], - ["URL", "Reference", "url", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "published in", DataType.VARCHAR, None, "", None, None, False] -]; - -chemicalDefinition = [ - ["ARTICLE", "General", "Article", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ARTICLE_NUM", "General", "Article Number", DataType.VARCHAR, None, "", None, None, False], - ["RECORD_NUMBER", "General", "RecordNumber", DataType.VARCHAR, None, "", None, None, False], - ["LOCATION", "Location", "Location", DataType.VARCHAR, None, "", None, None, False] -]; - -siRNADefinition = [ - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["EXON_OR_THREE_PRIME", "General", "exon or three prime", DataType.CONTROLLEDVOCABULARY, "EXON_OR_THREE_PRIME", "", None, None, False], - ["EXON", "General", "exon #", DataType.INTEGER, None, "", None, None, False], - ["3_PRIME_POSITION", "General", "3' position", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "SIRNA_SPECIES", "", None, None, False], - ["SEQUENCE", "General", "SEQUENCE", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "SIRNA_COMPANY", "", None, None, False], - ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.REAL, None, "", None, None, False], - ["WORKING_CONCENTRATION", "General", "Working concentration", DataType.REAL, None, "", None, None, False], - ["EFFICIENCY", "General", "Efficiency", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_QPCR", "General", "Efficiency_qPCR", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_WESTERN", "General", "Efficiency_Western", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_OTHER", "General", "Efficiency_other", DataType.VARCHAR, None, "", None, None, False], - ["OFF_TARGET_EFFECTS", "General", "Off target effects", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["SPECIFIC_SPLICE_VARIANT", "General", "Specific splice variant", DataType.VARCHAR, None, "", None, None, False], - ["TRANSFECTION_AGENT", "General", "Transfection agent", DataType.CONTROLLEDVOCABULARY, "TRANSFECTION_AGENT", "", None, None, False], - ["LIBRARY", "General", "Library", DataType.VARCHAR, None, "", None, None, False], - ["CHARACTERIZED_BY_COMPANY", "General", "Characterized by company", DataType.VARCHAR, None, "", None, None, False], - ["NUMBERINPOOL", "General", "NumberINpool", DataType.INTEGER, None, "", None, None, False], - ["TEST", "General", "Test", DataType.VARCHAR, None, "", None, None, False], - ["CHEMICAL_MODIFICATION", "General", "Chemical modification", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_OLIGONUMBER", "General", "siRNA_OligoNumber", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_FREEZER_LOCATION", "General", "Freezer Location", DataType.CONTROLLEDVOCABULARY, "SIRNA_FREEZER_LOCATION", "", None, None, False], - ["DRAWER", "General", "Drawer", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED", "Reference", "Published", DataType.VARCHAR, None, "", None, None, False] -]; - -# -# Data Set Types -# -documentDefinition = [ - ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["ID_NR", "General", "id_nr", DataType.VARCHAR, None, "", None, None, False], - ["FILE", "General", "file", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL", "General", "serial", DataType.INTEGER, None, "", None, None, False] - -]; diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitionsVoc.py b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitionsVoc.py deleted file mode 100644 index 83fc17f19b34ba3d65064d86fb5089432afbf91c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/defs/definitionsVoc.py +++ /dev/null @@ -1,846 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "ALL_LAB_MEMBERS" : [ - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["BRIAN_LUKE", "Brian Luke"], - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["CELINE_LAFOURCADE", "Celine Lafourcade"], - ["CHRISTINE_RUPP", "Christine Rupp"], - ["CLAUDINE_KRAFT", "Claudine Kraft"], - ["EDYTA_SIERGIEJUK", "Edyta Siergiejuk"], - ["FABIAN_HERZOG", "Fabian Herzog"], - ["FABIAN_RUDOLF", "Fabian Rudolf"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["GWEN_RABUT", "Gw\xe9nael Rabut"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["IRAM_ZAIDI", "Iram Zaidi"], - ["IZABELA_SUMARA", "Izabela Sumara"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["MALIKAJAQUENOUD", "MalikaJaquenoud"], - ["MARC_SOHRMANN", "Marc Sohrmann"], - ["MARIE-LYN_HECHT", "Marie-Lyn Hecht"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["MICHAEL_OLMA", "Michael Olma"], - ["MICHAEL_SCHNEIDER", "Michael Schneider"], - ["MICHELE_KNAUS", "Michele Knaus"], - ["MONIKA_GERSBACH", "Monika Gersbach"], - ["NATHALIE_MEYER-SCHALLER", "Nathalie Meyer-Schaller"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["NICOLAS_DARD", "Nicolas Dard"], - ["NICOLAS_PAGE", "Nicolas Page"], - ["PATRICK_PEDRIOLI", "Patrick Pedrioli"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["PIERRE_MAILLARD", "Pierre Maillard"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["SANDER_SPRINGER", "Sander Springer"], - ["SARAH_GLASER", "Sarah Glaser"], - ["SARAH_MAERKI", "Sarah M\xe4rki"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["SERGE_PELET", "Serge Pelet"], - ["STEFAN_MUELLER", "Stefan M�ller"], - ["TANIA_ROBERTS", "Tania Roberts"], - ["THIMO_KURZ", "Thimo Kurz"], - ["TOBIAS_BRAUN", "Tobias Braun"], - ["VANESSA_REZGUI", "Vanessa Rezgui"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["YVONNE_GLOOR", "Yvonne Gloor"], - ["JOCHEN_BECK", "Jochen Beck"], - ["MONIKA_KIJANSKA", "Monika Kijanska"], - ["ANGIE_RAGHEB", "Angie Ragheb"], - ["ANNE_PACQUELET", "Anne Pacquelet"], - ["BJORN_HEGEMANN", "Bj\xf6rn Hegemann"], - ["JANNY_TILMA", "Janny Tilma"], - ["THIBAULT_COURTHEOUX", "Thibault Courtheoux"], - ["SAMUEL_GILBERTO", "Samuel Gilberto"], - ["REMY_BUSER", "Remy Buser"], - ["RADOSLAV_ENCHEV", "Radoslav Enchev"], - ["MICHAELA_HUBNER", "Michaela Hubner"], - ["MIA_LI", "Mia Li"], - ["JULIEN_MOUYSSET", "Julien Mouysset"] - ], - "LAB_MEMBERS_INITIALS" : [ - ["AD", "AD"], - ["ACB", "ACB"], - ["BL", "BL"], - ["CZ", "CZ"], - ["CL", "CL"], - ["CR", "CR"], - ["CK", "CK"], - ["ES", "ES"], - ["FH", "FH"], - ["FR", "FR"], - ["FD", "FD"], - ["GJ", "GJ"], - ["GR", "GR"], - ["ISS", "ISS"], - ["IZ", "IZ"], - ["IS", "IS"], - ["LP", "LP"], - ["MJ", "MJ"], - ["MSO", "MSo"], - ["MH", "MH"], - ["MG", "MG"], - ["MP", "MP"], - ["MO", "MO"], - ["MSC", "MSc"], - ["MK", "MK"], - ["MG", "MG"], - ["NS", "NS"], - ["NPE", "NPe"], - ["ND", "ND"], - ["NPA", "NPa"], - ["PP", "PP"], - ["PW", "PW"], - ["PM", "PM"], - ["RD", "RD"], - ["SS", "SS"], - ["SG", "SG"], - ["SMA", "SMa"], - ["SL", "SL"], - ["SP", "SP"], - ["SM", "SM"], - ["TR", "TR"], - ["TK", "TK"], - ["TB", "TB"], - ["VR", "VR"], - ["WP", "WP"], - ["YS", "YS"], - ["YG", "YG"], - ["JB", "JB"], - ["MKI", "MKi"] - ], - "BLOCK" : [ - ["1BSA_01TRITON-X100", "1% BSA; 0.1% Triton-X100"], - ], - "CLASS" : [ - ["IGM", "IgM"], - ["IGG1", "IgG1"], - ["IGG2", "IgG2"] - ], - "COMPANY" : [ - ["ABCAM", "abcam"], - ["CELL_SIGNALING", "cell signaling"], - ["STRATAGEN", "stratagene"], - ["CLONTECH", "clontech"], - ["UBI", "ubi"], - ["SOUTHERN_BIOTECH", "southern biotech"], - ["PIERCE", "pierce"], - ["PHARMIGEN", "pharmingen"], - ["MOLECULAR_PROBES", "molecular probes"], - ["PHARMACIA", "pharmacia"], - ["BIORAD", "biorad"], - ["EUROGENETIC", "eurogentec"], - ["HOMEMADE", "homemade"], - ["BD_BIOSCIENCE", "BD bioscience"], - ["OBTAINED_FROM", "obtained from "], - ["ZYMED", "Zymed"], - ["UNKNOWN", "Unknown"], - ["SANTA_CRUZ", "Santa Cruz"], - ["BIOLEGEND", "Biolegend"], - ["BETHYL", "Bethyl"], - ["UPSTATE", "Upstate"], - ["ROCKLAND", "Rockland"], - ["NOVUS_BIOLOGICALS", "Novus Biologicals"], - ["CHEMICON_INTERNATIONAL", "Chemicon International"], - ["SIGMA", "Sigma"], - ["ALPHA_DIAGNOSTIC_INTERNATIONAL", "Alpha Diagnostic International"], - ["MILLIPORE", "Millipore"], - ["ACTIVE_MOTIF", "Active motif"], - ["NEB", "NEB"], - ["NEOMARKERS", "Neomarkers"], - ["LUBIOSCIENCE", "LubioScience"], - ["EBIOSCIENCE", "eBioscience"], - ["INVITROGEN", "Invitrogen"], - ["STRESSGEN", "Stressgen"], - ["COVANCE", "Covance"], - ["ENZO_LIFE_SCIENCES", "Enzo Life Sciences"], - ["CALBIOCHEM", "Calbiochem"], - ["ROCHE", "Roche"], - ["CYTOSKELETON", "Cytoskeleton"], - ["OPEN_BIOSYSTEMS", "Open Biosystems"], - ["BD_TRANSDUCTION", "BD Transduction"], - ["ATLAS_ANTIBODIES_AB", "Atlas Antibodies AB"], - ["GENENTECH", "Genentech"], - ["TRANSDUCTION_LABS", "Transduction Labs"], - ["ANTIBODIES_INCORPORATED", "Antibodies Incorporated"], - ["BABCO", "BAbCO"], - ["ERICH_NIGG_LAB_BASEL", "Erich Nigg lab (Basel)"], - ["FRANCIS_BARR", "Francis Barr"], - ["AVIVA_SYSTEMS_BIOLOGY", "Aviva Systems Biology"], - ["LUCERNACHEM", "LucernaChem"], - ["LI-COR", "LI-COR"], - ["ABGENT", "Abgent"], - ["CHROMOTEK", "Chromotek"], - ["ABNOVA", "Abnova"], - ["UNKNOWN", "Unknown"], - ["ABSEA", "Absea"], - ["GE_HEALTHCARE", "GE Healthcare"], - ["GRAMSCH_LABORATORIES", "Gramsch Laboratories"], - ["ADIPOGEN", "Adipogen"], - ["COSMO_BIO_CO", "Cosmo bio co."], - ["BECKTON_DICKINSON", "Beckton Dickinson"], - ["BIOTIUM", "Biotium"] - ], - "CONCENTRATION_FACS" : [ - ["1_TO_10", "1 : 10"], - ["1_TO_20", "1 : 20"], - ["1_TO_30", "1 : 30"], - ["1_TO_40", "1 : 40"], - ["1_TO_50", "1 : 50"], - ["1_TO_100", "1 : 100"], - ["1_TO_200", "1 : 200"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_IP" : [ - ["1UL", "1 �l"], - ["5UL", "5 �l"], - ["10UL", "10 �l"], - ["15UL", "15 �l"], - ["20UL", "20 �l"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_WESTERN" : [ - ["1_TO_100", "1 : 100"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["1_TO_5000", "1 : 5000"], - ["1_TO_10000", "1 : 10000"], - ["1_TO_20000", "1 : 20000"], - ["1_TO_25000", "1 : 25000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CURRENT_LAB_MEMBERS" : [ - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["JOCHEN_BECK", "Jochen Beck"] - ], - "FIX" : [ - ["1H-RT", "1h, RT"], - ["PTEMF", "PTEMF"], - ["PFA", "PFA"], - ["MEOH", "MeOH"] - ], - "LABEL" : [ - ["HRP", "hrp"], - ["AP", "ap"], - ["FITC", "fitc"], - ["CY3", "Cy3"], - ["ALEXA647", "Alexa 647"] - ], - "ANTIBODY_LOCATION" : [ - ["SMALL_PETER_LAB", "Small Peter Lab"], - ["BIG_PETER_LAB", "Big Peter Lab"], - ["NEW_PETER_LAB", "New Peter Lab"], - ["MINUS20_C-FLOOR", "-20C C-Floor"] - ], - "MONO-POLYCLONAL" : [ - ["MONOCLONAL", "Monoclonal"], - ["POLYCLONAL", "Polyclonal"], - ["UNKNOWN", "Unknown"] - ], - "SOURCE" : [ - ["MOUSE", "Mouse"], - ["RABBIT", "Rabbit"], - ["HAMSTER", "Hamster"], - ["GOAT", "Goat"], - ["RAT", "Rat"], - ["CHICKEN", "Chicken"], - ["SHEEP", "Sheep"], - ["HUMAN", "Human"], - ["GUINEA_PIG", "Guinea pig"], - ["DONEKY", "Donkey"], - ["UNKNOWN", "Unknown"] - ], - "CELL_LOCATION" : [ - ["FRIDGE", "fridge"], - ["FREEZER", "freezer"], - ["REFCO", "refco"], - ["TANK", "tank"] - ], - "SELECTION" : [ - ["NEOMYCIN_G418", "Neomycin/G418"], - ["HYGROMYCIN", "Hygromycin"], - ["MPA", "MPA"], - ["G418", "G418"], - ["PUROMYCIN", "puromycin"], - ["BLASTICIDIN", "Blasticidin"], - ["ZEOCIN", "Zeocin"] - ], - "CO2" : [ - ["5", "5"], - ["7.5", "7.5"] - ], - "GROWTH_TEMPERATURE" : [ - ["37", "37"], - ["28", "28"], - ["34", "34"] - ], - "MEDIUM" : [ - ["RPMI1640", "RPMI 1640"], - ["ISCOVES", "Iscoves"], - ["DMEM", "DMEM"], - ["LB", "LB"], - ["DMEM_NUTRIENT", "DMEM nutrient mixture F-12 HAM [D8437]"] - ], - "CELL_OBTAINED_FROM" : [ - ["FREIBURG", "Freiburg"], - ["ATCC", "ATCC"], - ["DANIEL_GERLICH", "Daniel Gerlich"], - ["ERICH_NIGG", "Erich Nigg"], - ["KREK", "Krek"], - ["TONY_HEYMAN", "Tony Heyman"], - ["THOMAS-WILD_ULRIKE-KUTAY", "Thomas Wild/Ulrike Kutay"], - ["JAN_MICHAEL_PETERS", "Jan-Michael Peters"], - ["M_BRANDEIS", "M Brandeis"], - ["ARI_HELENIUS", "Ari Helenius"], - ["ROMEO_RICCI", "Romeo Ricci"] - ], - "CELL_SPECIES" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["CHINESE_HAMSTER", "chines hamster"], - ["HYBRIDOMA", "hybridoma (human & mouse)"] - ], - "CONC_UNITS" : [ - ["MICROG_MICROL", "�g/�l"], - ["MG_ML", "mgl/ml"], - ["UG_ML", "ug/ml"] - ], - "STRAIN_SOURCE" : [ - ["F_CHANG", "F. Chang"], - ["J_CHANT", "J. Chant"], - ["R_DESHAIES", "R. Deshaies"], - ["E_ELION", "E. Elion"], - ["P_HIETER", "P. Hieter"], - ["I_HERSKOWITZ", "I. Herskowitz"], - ["A_NEIMAN", "A. Neiman"], - ["P_SORGER", "P. Sorger"], - ["T_STEARNS", "T. Stearns"], - ["MARC_BONDEL", "Marc Bondel"], - ["G_SUMARA", "G. Sumara"], - ["MICHAEL_ALTMANN", "Michael Altmann"], - ["HETEROZYGOUS_DIPLOID_COLLECTION", "Heterozygous diploid collection"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["ANNE_PAQUELET", "Anne Paquelet"], - ["YAGMUR-TURGAY_KUTAY-GROUP", "Yagmur Turgay - Kutay group"], - ["BARBAR_CATARIN", "Barbar Catarin"], - ["FRANK_VAN-DROGEN", "Frank van Drogen"], - ["HEMMO_MEYER", "Hemmo Meyer"], - ["JEAN-MARC_GALLAND", "Jean-Marc Galland"], - ["JEFF_PARVIN", "Jeff Parvin"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MIKIKO_TAKAHASHI", "Mikiko Takahashi"], - ["SANDRA_HENCHOZ", "Sandra Henchoz"], - ["MALIKA_JAQUENOUD", "Malika Jaquenoud"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["CELINE_LAFOURCADE", "Céline Lafourcade"], - ["CELINE_LONGARETTI", "Céline Longaretti"], - ["BRIAN_LUKE", "Brian Luke"], - ["GUY_NIEDERHAUSER", "Guy Niederhäuser"], - ["NICOLAS_PAGE", "Nicolas Pag�"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["AUDREY_PETIT", "Audrey Petit"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["VOLKER_STUCKE", "Volker Stucke"], - ["KATRIN_PETER", "Katrin Peter"], - ["MARC_BLONDEL", "marc blondel"], - ["M_FUNK", "M. Funk"], - ["ATTILA_BECSKEI", "Attila Becskei"], - ["GWENAEL_RABUT", "Gwenael Rabut"], - ["PHILIP_JERMANN", "Philip Jermann"], - ["P_PRYCIAK", "P.Pryciak"], - ["LINDA_HICKE", "Linda Hicke"], - ["RZPD", "RZPD"], - ["OPENBIO", "OpenBio"], - ["F_POSAS", "F. Posas"], - ["HAPLOID_COLLECTION", "Haploid collection"], - ["MIRIAM_BORTFELD", "Miriam Bortfeld"], - ["EUROSCARF", "Euroscarf"], - ["TS_COLLECTION", "ts collection"], - ["CONZELMANN_LAB", "Conzelmann lab"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["BIBOU", "Bibou"], - ["MARC_SOHRMANN", "Marc sohrmann"] - ], - "SELECTION_YEAST" : [ - ["NONE", "None"], - ["URA", "Ura"], - ["LEU", "Leu"], - ["TRP", "Trp"], - ["HIS", "His"], - ["VIABILITY", "Viability"], - ["NAT", "nat"], - ["KAN", "kan"], - ["KAN_NAT", "kan + nat"], - ["HIS_KAN", "HIS + kan"], - ["HIS_KAN_NAT", "HIS + kan + nat"], - ["HIS", "HIS"], - ["LEU_NAT", "leu + nat"], - ["ADE2", "ade2"] - ], - "DERIVATION" : [ - ["GAMMA_INTEG", "gamma integ"], - ["DELTA_INTEG", "� integ"], - ["5FAO_LOOPOUT", "5-FAO loopout"], - ["PLASMID_SHUFFLE", "plasmid shuffle"], - ["TETRAD", "tetrad"], - ["LOOP-IN_LOOP-OUT", "loop-in/loop-out"], - ["GALPHO", "GalpHO mating type switch"], - ["DELETION", "Deletion"], - ["INTEGRATION", "Integration"] - ], - "STRAIN_BACKGROUND" : [ - ["W303", "W303"], - ["K699", "K699"], - ["K700", "K700"], - ["S288C", "S288C"], - ["1278", "*1278*"], - ["EG123", "EG123"], - ["DF5", "DF5"], - ["SIGMA", "Sigma"], - ["UNKNOWN", "Don't know"], - ["BY7092", "BY7092"], - ["BY5565", "BY5565"], - ["BY4741", "BY4741"] - ], - "CIR" : [ - ["CIR_PLUS", "cir+"], - ["CIR_DEG", "cir�"], - ], - "GAL" : [ - ["PLUS", "Plus"], - ["PLUS_PLUS", "Plus/Plus"], - ["GAL1", "gal1"], - ["GAL1_GAL1", "gal1/gal1"], - ["GAL2", "gal2"], - ["GAL2_GAL2", "gal2/gal2"], - ], - "MAT" : [ - ["AT", "@"], - ["A", "a"], - ["ALPHA", "alpha"], - ["DIPLOID", "diploid"], - ["UNKNOWN", "unknown"] - ], - "OLIGO_ORGANISM" : [ - ["BMV", "BMV"], - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"], - ["HIV1", "HIV-1"], - ["CELEGANS", "C.elegans"], - ["MYCOPLASMA", "mycoplasma"] - ], - "OLIGO_GRADE" : [ - ["DESALTED", "desalted"], - ["HPLC", "hplc"], - ["PURITY", "purity"], - ["UNKNOWN", "?"] - ], - "PRIMER_POSITION" : [ - ["FORWARD", "forward"], - ["REVERSE", "reverse"] - ], - "OLIGO_COMPANY" : [ - ["MWG", "MWG"], - ["BIG", "BIG"], - ["PHARMACIA", "Pharmacia"], - ["IGLOI", "Igloi"], - ["INVITROGEN", "invitrogen"], - ["MICROSYNTH", "microsynth"] - ], - "OLIGO_USAGE" : [ - ["PCR", "pcr"], - ["SEQUENCING", "sequencing"], - ["HYBRIDIZE", "hybridize"], - ["MUTAGENESIS", "mutagenesis"], - ["RT-PCR", "Real-Time PCR"] - ], - "RESTRICTION" : [ - ["AATII", "AatII"], - ["ACCI", "AccI"], - ["ACII", "AciI"], - ["AFLII", "AflII"], - ["AFLIII", "AflIII"], - ["AGEI", "AgeI"], - ["ALUI", "AluI"], - ["ALWI", "AlwI"], - ["ALWNI", "AlwNI"], - ["APAI", "ApaI"], - ["APALI", "ApaLI"], - ["APOI", "ApoI"], - ["ASCI", "AscI"], - ["ASEI", "AseI"], - ["AVAI", "AvaI"], - ["AVAII", "AvaII"], - ["AVRII", "AvrII"], - ["BAMHI", "BamHI"], - ["BANI", "BanI"], - ["BANII", "BanII"], - ["BBSI", "BbsI"], - ["BBVI", "BbvI"], - ["BCGI-1", "BcgI-1"], - ["BCGI-2", "BcgI-2"], - ["BCLI", "BclI"], - ["BFAI", "BfaI"], - ["BGLI", "BglI"], - ["BGLII", "BglII"], - ["BLPI", "BlpI"], - ["BPMI", "BpmI"], - ["BSAAI", "BsaAI"], - ["BSABI", "BsaBI"], - ["BSAHI", "BsaHI"], - ["BSAI", "BsaI"], - ["BSAJI", "BsaJI"], - ["BSAWI", "BsaWI"], - ["BSERI", "BseRI"], - ["BSGI", "BsgI"], - ["BSIEI", "BsiEI"], - ["BSIHKAI", "BsiHKAI"], - ["BSIWI", "BsiWI"], - ["BSLI", "BslI"], - ["BSMAI", "BsmAI"], - ["BSMBI", "BsmBI"], - ["BSMFI", "BsmFI"], - ["BSMI", "BsmI"], - ["BSOFI", "BsoFI"], - ["BSP1286I", "Bsp1286I"], - ["BSPEI", "BspEI"], - ["BSPHI", "BspHI"], - ["BSPMI", "BspMI"], - ["BSRBI", "BsrBI"], - ["BSRDI", "BsrDI"], - ["BSRFI", "BsrFI"], - ["BSRGI", "BsrGI"], - ["BSRI", "BsrI"], - ["BSSHII", "BssHII"], - ["BST1107I", "Bst1107I"], - ["BSTBI", "BstBI"], - ["BSTEII", "BstEII"], - ["BSTNI", "BstNI"], - ["BSTUI", "BstUI"], - ["BSTXI", "BstXI"], - ["BSTYI", "BstYI"], - ["BSU36I", "Bsu36I"], - ["CAC8I", "Cac8I"], - ["CLAI", "ClaI"], - ["CVIJI", "CviJI"], - ["DDEI", "DdeI"], - ["DPNI", "DpnI"], - ["DRAI", "DraI"], - ["DRAIII", "DraIII"], - ["DRDI", "DrdI"], - ["DSAI", "DsaI"], - ["EAEI", "EaeI"], - ["EAGI", "EagI"], - ["EAM1105I", "Eam1105I"], - ["EARI", "EarI"], - ["ECO47III", "Eco47III"], - ["ECO57I", "Eco57I"], - ["ECONI", "EcoNI"], - ["ECOO109I", "EcoO109I"], - ["ECORI", "EcoRI"], - ["ECORV", "EcoRV"], - ["FOKI", "FokI"], - ["FSEI", "FseI"], - ["FSPI", "FspI"], - ["HAEII", "HaeII"], - ["HAEIII", "HaeIII"], - ["HGAI", "HgaI"], - ["HHAI", "HhaI"], - ["HINCII", "HincII"], - ["HINDIII", "HindIII"], - ["HINFI", "HinfI"], - ["HPAI", "HpaI"], - ["HPAII", "HpaII"], - ["HPHI", "HphI"], - ["KPNI", "KpnI"], - ["MAEII", "MaeII"], - ["MAEIII", "MaeIII"], - ["MBOI", "MboI"], - ["MBOII", "MboII"], - ["MLUI", "MluI"], - ["MNLI", "MnlI"], - ["MSCI", "MscI"], - ["MSEI", "MseI"], - ["MSLI", "MslI"], - ["MSPA1I", "MspA1I"], - ["MUNI", "MunI"], - ["MWOI", "MwoI"], - ["NAEI", "NaeI"], - ["NARI", "NarI"], - ["NCII", "NciI"], - ["NCOI", "NcoI"], - ["NDEI", "NdeI"], - ["NHEI", "NheI"], - ["NLAIII", "NlaIII"], - ["NLAIV", "NlaIV"], - ["NOTI", "NotI"], - ["NRUI", "NruI"], - ["NSII", "NsiI"], - ["NSPI", "NspI"], - ["PACI", "PacI"], - ["PFLMI", "PflMI"], - ["PLEI", "PleI"], - ["PMEI", "PmeI"], - ["PMLI", "PmlI"], - ["PPUMI", "PpuMI"], - ["PSHAI", "PshAI"], - ["PSP1406I", "Psp1406I"], - ["PSTI", "PstI"], - ["PVUI", "PvuI"], - ["PVUII", "PvuII"], - ["RSAI", "RsaI"], - ["RSRII", "RsrII"], - ["SACI", "SacI"], - ["SACII", "SacII"], - ["SALI", "SalI"], - ["SAPI", "SapI"], - ["SAU96I", "Sau96I"], - ["SCAI", "ScaI"], - ["SCRFI", "ScrFI"], - ["SEXAI", "SexAI"], - ["SFANI", "SfaNI"], - ["SFCI", "SfcI"], - ["SFII", "SfiI"], - ["SGFI", "SgfI"], - ["SGRAI", "SgrAI"], - ["SMAI", "SmaI"], - ["SNABI", "SnaBI"], - ["SPEI", "SpeI"], - ["SPHI", "SphI"], - ["SRFI", "SrfI"], - ["SSE8387I", "Sse8387I"], - ["SSPI", "SspI"], - ["STUI", "StuI"], - ["STYI", "StyI"], - ["SWAI", "SwaI"], - ["TAQI", "TaqI"], - ["TFII", "TfiI"], - ["TSP45I", "Tsp45I"], - ["TSP509I", "Tsp509I"], - ["TTH111I", "Tth111I"], - ["XBAI", "XbaI"], - ["XCMI", "XcmI"], - ["XHOI", "XhoI"], - ["XMNI", "XmnI"], - ["SACI_NHEI", "sacI NheI"], - ["XMAI", "XmaI"], - ["BAMHI", "BamHI"], - ["CLAI", "ClaI"], - ["PACI", "PacI"], - ["NOTI", "NotI"], - ["SALI", "SalI"], - ["XHOI", "XhoI"], - ["NONE", "none"] - ], - "BACKBONE" : [ - ["PCDNA3", "pCDNA3"], - ["PABES-NEO2000", "pABES-neo 2000"], - ["PUC19", "pUC 19"], - ["PMX-1", "pMX-1"], - ["PRMHA-3", "pRmHa-3"] - ], - "BACTERIAL_HOST" : [ - ["DH10B", "DH10B"], - ["JM110", "JM110"], - ["BL21", "BL21"], - ["DH5A", "DH5a"], - ["PB3", "PB3"], - ["DB31", "DB3.1"], - ["CCDB_SURVIVAL", "ccdB survival"] - ], - "BIOSAFETY_LEVEL" : [ - ["S1", "S1"], - ["S2", "S2"], - ["S3", "S3"] - ], - "SELECTION_IN_BACTERIA" : [ - ["AMPICILLIN", "Ampicillin"], - ["KANAMYCIN", "Kanamycin"], - ["SPECTINOMCIN", "Spectinomcin"], - ["UNKNOWN", "Unknown"] - ], - "SELECTION_IN_EUKARYOTES" : [ - ["G418_NEO", "G418/neo"], - ["MPA", "MPA"], - ["HYGROMYCIN", "Hygromycin"] - ], - "SOURCE_OF_REPLICON" : [ - ["CMV", "CMV"] - ], - "PLASMID_ORGANISM" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"] - ], - "PROMOTER" : [ - ["ENDOGENOUS", "endogenous"], - ["GAL1", "gal1"], - ["GALL", "galL"], - ["GALS", "galS"], - ["TET", "tet"], - ["ADH", "adh"], - ["CYC", "cyc"], - ["GPD", "gpd"], - ["DASH", "\"-\""], - ["CMV", "cmv"], - ["SV40", "SV40"], - ["TET_ON", "tet on"], - ["TET_OFF", "tet off"], - ["RIM1", "rim1"] - ], - "EXON_OR_THREE_PRIME" : [ - ["EXON", "exon"], - ["3P", "3'"], - ["5P", "5'"] - ], - "SIRNA_SPECIES" : [ - ["HUMAN", "Human"], - ["MOUSE", "Mouse'"], - ], - "SIRNA_COMPANY" : [ - ["AMBION", "Ambion"], - ["DHARMACON", "Dharmacon'"], - ["INVITORGEN", "Invitrogen'"], - ["MICROSYNTH", "Microsynth'"], - ["QIAGEN", "Qiagen'"], - ["GIFT", "Gift'"] - ], - "SIRNA_FREEZER_LOCATION" : [ - ["BIGLABFREEZER", "BigLab freezer"], - ["SMALLLAB_BIGFREEZER", "SmallLab Big freezer'"], - ["FREEZER_G17", "Freezer G17'"], - ["G93-FRANK", "G9.3--Frank'"], - ["FREEZER-G17_BOX_NATHALIE", "Freezer G17 Box Nathalie'"], - ["BOX-THIBAULT-BIGFREEZER-SMALLLAB", "Box thibault Big freezer small lab'"], - ["BOX-NATHALIE", "Box Nathalie'"] - ], - "TRANSFECTION_AGENT" : [ - ["FUGENE", "Fugene"], - ["LIPOFECTAMINE", "Lipofectamine'"], - ["OLIGOFECTAMINE", "Oligofectamine'"], - ["RNAIMAX", "RNAimax'"] - ], - "FREEZER" : [ - ["G9_FRIDGE-1", "G9 Fridge 1"], - ["G9_FRIDGE-2", "G9 Fridge 2"], - ["G9_FREEZER-A", "-20C Small Peter Lab"], - ["G9_FREEZER-B", "G9 Freezer B"], - ["G9_FREEZER-C", "G9 Freezer C"], - ["G10_FREEZER-D", "G10 Freezer D"], - ["G10_FREEZER-E", "G10 Freezer E"], - ["G10_FREEZER-F", "G10 Freezer F"], - ["G10_FREEZER-G", "G10 Freezer G"], - ["G10_FREEZER-H", "G10 Freezer H"], - ["G10_FREEZER-I", "G10 Freezer I"], - ["G10_FRIDGE-3", "+4C Big Peter Lab"], - ["G10_FRIDGE-4", "G10 Fridge 4"], - ["G10_FRIDGE-5", "G10 Fridge 5"], - ["G10_FRIDGE-6", "G10 Fridge 6"], - ["G10_FRIDGE-7", "G10 Fridge 7"], - ["G11_FRIDGE-8", "G10 Fridge 8"], - ["G14_FREEZER-J", "G14 Freezer J"], - ["G14_FREEZER-K", "G14 Freezer K"], - ["G14_FREEZER-L", "G14 Freezer L"], - ["G14_FREEZER-M", "G14 Freezer M"], - ["G14_FRIDGE-9", "G14 Fridge 9"], - ["G14_FRIDGE-10", "G14 Fridge 10"], - ["G17_FRIDGE-11", "G17 Fridge 11"], - ["G17_FRIDGE-12", "G17 Fridge 12"], - ["G17_FREEZER-N", "G17 Freezer N"], - ["USER_BENCH-20", "Bench -20�C"], - ["USER_BENCH-80", "Bench -80�C"], - ["USER_BENCH-RT", "Bench RT"], - ["USER_BENCH", "Bench"] - ] - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/doc/fm11_odbc_jdbc_guide_en.pdf b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/doc/fm11_odbc_jdbc_guide_en.pdf deleted file mode 100644 index 36aaa0f12220dbde26b7ece4e3b78914087893b0..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/doc/fm11_odbc_jdbc_guide_en.pdf and /dev/null differ diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/FileMakerMain.java deleted file mode 100644 index a2206338c1ccb79267396fbe2751fbb529304ab8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/FileMakerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - - -// STEP By Step: -// 1. Open the file maker file with file maker pro -// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on -// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" -// Without closing file maker pro you can run this script, modify it as needed -// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf - -public class FileMakerMain -{ - // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this - public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; - public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; - - static class Document { - String fileName; - String info; - String serial; - - public String toString() - { - return fileName + " " + info; - } - } - - public static List<Document> getDocuments(Connection connection) throws SQLException { - List<Document> documents = new ArrayList<Document>(); - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); - ResultSet result = preparedStatement.executeQuery(); - - while(result.next()) { - Document document = new Document(); - document.fileName = result.getString("fileName"); - document.info = result.getString("info"); - document.serial = result.getString("serial"); - documents.add(document); - } - result.close(); - preparedStatement.close(); - return documents; - } - - public static byte[] getFile(Connection connection, Document document) throws SQLException { - byte[] bytes = {}; - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); - preparedStatement.setString(1, document.serial); - ResultSet result = preparedStatement.executeQuery(); - if(result.next()) { - byte[] value = result.getBytes("fileData"); - if(value != null) { - bytes = value; - } - } - result.close(); - preparedStatement.close(); - return bytes; - } - - public static void main(String[] args) throws Exception { - Class.forName("com.filemaker.jdbc.Driver").newInstance(); - Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); - - for(Document document: getDocuments(connection)) { - byte[] bytes = getFile(connection, document); - System.out.println(document + " " + bytes.length); - } - connection.close(); - } -} diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/fmjdbc.jar b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/fmjdbc.jar deleted file mode 100644 index 34cae1d60b916205b9039fe765c971229cef1a32..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/lib/fmjdbc.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/migration.py b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/migration.py deleted file mode 100644 index b0219bb64a5cdeebc863d1d3900f5e3a236dd56c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/migration.py +++ /dev/null @@ -1,522 +0,0 @@ -# some_file.py -import sys -import traceback -import definitions -import definitionsVoc -import re -import random -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -import java.lang.Class as Class -import java.sql.DriverManager as DriverManager - - -## -## Generic Process Method -## -notMigratedEntities = { - "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} - } - -def getStringValueOrNone(map, key): - if (key in map) and (map[key] is not None) and (map[key] is not ""): - return map[key]; - else: - return None; - -def addNotMigratedEntity(type, entityID, error): - if type not in notMigratedEntities: - notMigratedEntities[type] = {} - if entityID not in notMigratedEntities[type]: - notMigratedEntities[type][entityID] = {} - if error not in notMigratedEntities[type][entityID]: - notMigratedEntities[type][entityID][error] = 1 - else: - notMigratedEntities[type][entityID][error] += 1 - -def printNotMigratedEntities(): - print "--- Not Migrated Entities Report" - for type in notMigratedEntities: - print "Type: [" + str(type) + "]" - for id in notMigratedEntities[type]: - for error in notMigratedEntities[type][id]: - print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) - print "---" - -def process(tr): - print "START!" - createDataHierarchy(tr) - for adaptor in adaptors: - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" - - if adaptor.__class__.__name__ == "PlasmidParentAdaptor": - print "check hack, dont do please" - adaptor.init(); - - while adaptor.next(): - entity = adaptor.getEntity() - print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" - try: - if not entity.isInOpenBIS(tr): - entity.write(tr) - else: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") - except Exception, error: - print traceback.format_exc() - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) - #print entity.getIdentifier(tr) + " - Already up to date" - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" - print "REPORT START" - printNotMigratedEntities() - definitionsVoc.printCreatedTerms() - print "REPORT FINISH" - print "FINISH!" -## -## Help Methods -## -def setEntityProperties(tr, definition, entity, properties): - for origPropertyCode, propertyValue in properties.iteritems(): - #print repr("setEntityProperties " + origPropertyCode + " : " + unicode(propertyValue)) - propertyCode = origPropertyCode; - if propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - elif propertyCode.startswith("-"): - continue - - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, origPropertyCode) - #print "Prop definition ", propertyDefinition - #print "PROP VALUE ", propertyValue - if propertyDefinition is not None and propertyValue is not None: - propertyValue = unicode(propertyValue) - - if propertyDefinition is not None and propertyDefinition[3] == DataType.REAL and propertyValue is not None: - if propertyValue =="?": - propertyValue="" - - if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue - else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 50: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - #print "NEW CODE", propertyValue - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - -## -## Generic Pattern -## -class EntityAdaptor: - entities = None - entitiesIdx = None - definition = None - definitionRepeats = None - - def init(self): - self.entities = [] - self.entitiesIdx = -1 - pass - - def next(self): - if self.entities is None and self.entitiesIdx is None: - self.init() - self.entitiesIdx += 1 - if len(self.entities) > self.entitiesIdx: - return True - else: - return False - - def addEntity(self, values): - self.entities.append(OpenBISDTO(values, self.definition)) - - def getEntity(self): - return self.entities[self.entitiesIdx] - -class OpenBISDTO: - values = {} - definition = None - - def __init__(self, values, definition): - self.values = values - self.definition = definition - - def getIdentifier(self, tr): - pass - - def isInOpenBIS(self, tr): - pass - - def write(self, tr): - pass - -## -## Costumer specific logic: generic part -## -experimentCache = {} -sampleCache = {} -sampleID2Sample = {} -globalSequences = {}; - -def getNextGlobalSequence(id, startingAt): - currentSequence = None; - - if id in globalSequences: - currentSequence = globalSequences[id]; #Get existing sequence - else: - if startingAt is not None: - currentSequence = startingAt; - else: - currentSequence = 0; # Create a new one - - #Advance and store new step on the sequence - currentSequence = currentSequence+1; - globalSequences[id] = currentSequence; - - #Return the new sequence number - return str(currentSequence); - -def getExperimentForUpdate(experimentIdentifier, experimentType, tr): - experimentType ="MATERIALS" - if experimentIdentifier not in experimentCache: - print "Cache failed " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.getExperimentForUpdate(experimentIdentifier) - if experiment is None and experimentType is not None: - print "Cache Create " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.createNewExperiment(experimentIdentifier, experimentType) - if experiment is not None: - experimentCache[experimentIdentifier] = experiment - else: - pass - #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) - if experimentIdentifier not in experimentCache: - return None - else: - return experimentCache[experimentIdentifier] - -def getSampleForUpdate(sampleIdentifier, sampleType, tr): - if sampleIdentifier not in sampleCache: - #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) - sample = tr.getSampleForUpdate(sampleIdentifier) - if sample is None and sampleType is not None: - #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) - if sampleType == "STRAIN": - experiment = getExperimentForUpdate("/MATERIALS/STRAINS/STRAIN_COLLECTION_1", sampleType, tr) - elif sampleType == "PLASMID": - experiment = getExperimentForUpdate("/MATERIALS/PLASMIDS/PLASMID_COLLECTION_1", sampleType, tr) - elif sampleType == "OLIGO": - experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1", sampleType, tr) - sample = tr.createNewSample(sampleIdentifier, sampleType) - sample.setExperiment(experiment) - if sample is not None: - sampleCache[sampleIdentifier] = sample - else: - pass - #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) - - if sampleIdentifier not in sampleCache: - raise None - else: - return sampleCache[sampleIdentifier] - -class FileMakerEntityAdaptor(EntityAdaptor): - connection = None - selectQuery = None - selectQueryRepetitions = None; - selectQueryRepetitionsId = None; - - def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): - Class.forName("com.filemaker.jdbc.Driver").newInstance() - self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) - - def init(self): - EntityAdaptor.init(self) - - # Default Query (All adaptors should have it) - preparedStatement = self.connection.prepareStatement(self.selectQuery) - #print "EXECUTED QUERY: " + self.selectQuery - result = preparedStatement.executeQuery() - - while result.next(): - values = {} - for property in self.definition: - if property[0].startswith("+"): - pass #Do Nothing - elif property[0]=="ANNOTATIONS_STATE": - values[property[0]] = ""; - else: - propertyCode = property[0]; - #print "propertyCode IS: ", propertyCode - propertyValue = result.getString(property[2]); - if property[0].startswith("+"): - propertyCode = property[0][1:]; - if property[0].startswith("-"): - propertyCode = property[0][1:]; - values[propertyCode] = result.getString(property[2]) - self.addEntity(values) - result.close() - preparedStatement.close() - # Repetitions Query (Optional) - - #Extra Repeats Logic - if self.definitionRepeats is not None: - fields = ""; - fieldsNames = []; - isFirst = True; - for field in self.definitionRepeats: - propertyCode = field[0]; - if propertyCode.startswith("+"): - continue - - if not isFirst: - fields = fields + ", "; - - fields = fields + field[2]; - fieldsNames.append(propertyCode); - isFirst = False; - - for entity in self.entities: - entityId = entity.values[self.selectQueryRepetitionsId]; - if entityId is not None: - perEntityQuery = "SELECT " + fields + " FROM " + self.selectQueryRepetitions + "= '" + entityId + "'"; - #print "EXECUTED QUERY: " + perEntityQuery - preparedStatement = self.connection.prepareStatement(perEntityQuery) - result = preparedStatement.executeQuery() - - columnCount = result.getMetaData().getColumnCount(); - while result.next(): - for cIdx in range(columnCount): - if cIdx is not 0: - columName = result.getMetaData().getColumnName(cIdx); - fieldName = fieldsNames[cIdx]; - entity.values[fieldName] = result.getString(cIdx); - result.close() - preparedStatement.close() - # - -## -## Customer specific logic: different sample types -## -class FMOpenBISDTO(OpenBISDTO): - def isSampleCacheable(self): - return True - - def isInOpenBIS(self, tr): - return False - # code = self.getIdentifier(tr) - # if (code is not None) and (' ' not in code): - # if self.isSampleCacheable(): - # sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) - # if (self.values["NAME"] is not None and len(self.values["NAME"]) > 0 and self.values["NAME"] not in sampleID2Sample): - # print "Cached Sample with name: '" + self.values["NAME"] + "' for '" + "/MATERIALS/" + code + "' in dict with size: " + str(len(sampleID2Sample)) - # parentName = unicode(self.values["NAME"], "utf-8"); - # sampleID2Sample[parentName] = sample - # return False - # else: - # print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" - # raise Exception('Invalid Code found ' + str(code)) - - -## -## Strains -## - -globalStrainsCodeCheck = {}; - -class StrainAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"Strain Collection\"" - - self.definition = definitions.strainDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(StrainOpenBISDTO(values, self.definition)) - -class StrainOpenBISDTO(FMOpenBISDTO): - code = None; - - def isSampleCacheable(self): - return False - - def write(self, tr): - code = self.getIdentifier(tr); - - sample = getSampleForUpdate("/MATERIALS/"+code,"STRAIN", tr) - setEntityProperties(tr, self.definition, sample, self.values) - - - def getIdentifier(self, tr): - if self.code is not None: - return self.code; - elif (self.values["BBPL_NUM"] is not None and self.values["BBPL_NUM"] not in globalStrainsCodeCheck): - self.code = "BBPL" + self.values["BBPL_NUM"] - globalStrainsCodeCheck[self.values["BBPL_NUM"]] = True - else: - nextNum = getNextGlobalSequence("BBPL", 0) - self.code = "BBPL_missing_" + nextNum; - globalStrainsCodeCheck[nextNum] = True - return self.code - - # def getIdentifier(self, tr): - # code="" - # if (self.values["BBPL_NUM"] is not None): - # # print "BBPL num", self.values["BBPL_NUM"] - # code = "BBPL" +self.values["BBPL_NUM"] - # else: - # code="BBPL" + getNextGlobalSequence("BBPL", None); - # # print "CODE 0", code - # return code - - -## -## Plasmids -## - -globalPlasmidsCodeCheck = {}; -globalPlasmidsList = []; - -class PlasmidAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"Strain Collection\"" - self.definition = definitions.plasmidDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(PlasmidOpenBISDTO(values, self.definition)) - -class PlasmidOpenBISDTO(FMOpenBISDTO): - code = None; - setParents = False; ## Should be true the second time - - def write(self, tr): - code = self.getIdentifier(tr) - sample = getSampleForUpdate("/MATERIALS/"+code,"PLASMID", tr) - if self.setParents is False: - setEntityProperties(tr, self.definition, sample, self.values) - globalPlasmidsList.append(self); - self.setParents = True; - if (self.values["NAME"] is not None and len(self.values["NAME"]) > 0 and self.values["NAME"] not in sampleID2Sample): - print "Cached Sample with name: '" + self.values["NAME"] + "' for '" + "/MATERIALS/" + code + "' in dict with size: " + str(len(sampleID2Sample)) - parentName = unicode(self.values["NAME"], "utf-8"); - sampleID2Sample[parentName] = sample - else: - parentsColumn = self.values["DERIVATIVE_OF"]; - if parentsColumn is not None: - print "Looking for parents : '" + parentsColumn + "'" - parentsNames = parentsColumn.strip().split(" and ") - parentsList = []; - for parentName in parentsNames: - parentName = unicode(parentName, "utf-8"); - if parentName in sampleID2Sample: - parentObject = sampleID2Sample[parentName] - parentsList.append(parentObject.getSampleIdentifier()) - else: - print "Parent name not found : '" + parentName + "' for dict with size : " + str(len(sampleID2Sample)) - - if len(parentsList) > 0: - sample.setParentSampleIdentifiers(parentsList) - - def getIdentifier(self, tr): - if self.code is not None: - return self.code; - elif (self.values["PL_NUMBER"] is not None and self.values["PL_NUMBER"] not in globalPlasmidsCodeCheck): - self.code = "PBPL" + self.values["PL_NUMBER"] - globalPlasmidsCodeCheck[self.values["PL_NUMBER"]] = True - else: - nextNum = getNextGlobalSequence("PBPL", 0) - self.code = "PBPL_missing_" + nextNum; - globalPlasmidsCodeCheck[nextNum] = True - return self.code - -class PlasmidParentAdaptor(EntityAdaptor): - def init(self): - self.entities = [] - self.entitiesIdx = -1 - for plasmid in globalPlasmidsList: - self.entities.append(plasmid); - - -## -## Oligos -## -class OligoAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"Strain Collection\"" - self.definition = definitions.oligoDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(OligoOpenBISDTO(values, self.definition)) - -class OligoOpenBISDTO(FMOpenBISDTO): - def write(self, tr): - code = "OBPL" + self.values["OBPL_NUMBER"]; - print "CODE IS:", code - if code is not None: - print "/MATERIALS/"+code - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - setEntityProperties(tr, self.definition, sample, self.values) - else: - print "OLIGO CODE NOT FOUND! " - - def getIdentifier(self, tr): - code="" - if (self.values["OBPL_NUMBER"] is not None): - code = "OBPL" + self.values["OBPL_NUMBER"] - else: - code = "OBPL" + getNextGlobalSequence("OBPL", None); - return code - - - -fmConnString = "jdbc:filemaker://127.0.0.1/" -#fmConnString = "jdbc:filemaker://fmsrv.ethz.ch/" -fmUser= "admin" -fmPass = "kanamycin" - - - -adaptors = [ - #OligoAdaptor(fmConnString, fmUser, fmPass, "03_BPL_Oligo_Collection"), - #PlasmidAdaptor(fmConnString, fmUser, fmPass, "pBPL_Plasmid_Collection_2014"), - #PlasmidParentAdaptor(), - StrainAdaptor(fmConnString, fmUser, fmPass, "bBPL_Strain_Collection") - ] - - - - - -def createDataHierarchy(tr): - inventorySpace = tr.getSpace("MATERIALS") - if inventorySpace == None: - tr.createNewSpace("MATERIALS", None) - tr.createNewSpace("METHODS", None) - tr.createNewProject("/MATERIALS/STRAINS") - tr.createNewProject("/MATERIALS/PLASMIDS") - tr.createNewProject("/MATERIALS/POLYNUCLEOTIDES") - tr.createNewExperiment("/MATERIALS/STRAINS/STRAIN_COLLECTION_1", "MATERIALS") - tr.createNewExperiment("/MATERIALS/PLASMIDS/PLASMID_COLLECTION_1","MATERIALS") - tr.createNewExperiment("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1","MATERIALS") \ No newline at end of file diff --git a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/plugin.properties b/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/plugin.properties deleted file mode 100644 index 5216a708c1df67a5b7c23aad82ddc0e6f6c185d9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/pankemigration/1/dss/drop-boxes/pankemigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = pankemigration -incoming-dir = ${root-dir}/pankemigration diff --git a/plasmid/source/core-plugins/petermigration/1/as/definitions.py b/plasmid/source/core-plugins/petermigration/1/as/definitions.py deleted file mode 100644 index 5a3adb701cdcc92c44a51a0802ec0c628fcaf8fd..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/as/definitions.py +++ /dev/null @@ -1,375 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -adenosineScriptName = "ADENOSINE_COUNT" -cytosineScriptName= "CYTOSINE_COUNT" -gcScriptName= "GC" -guanosineScriptName= "GUANOSINE_COUNT" -lengthScriptName= "SEQUENCE_LENGTH" -nucelotideScriptName= "ONUCLEOTIDE_COUNT" -thymidineScriptName= "THYMIDINE_COUNT" -tmScriptName= "TM" - -# -# Storage -# -numberOfStorageGroups = 65 - -def getStorageGroupPropertyCodes(): - propertyCodes = []; - for property in getStorageGroupDefinition(): - propertyCodes.append(property[0]); - return propertyCodes; - -def getStorageGroupDefinition(): - return [ - ["STORAGE_NAME", "Physical Storage", "location", DataType.CONTROLLEDVOCABULARY, "FREEZER", "Storage Name", None, None, False], - ["STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "box label", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["STORAGE_USER", "Physical Storage", "frozen by", DataType.VARCHAR, None, "Storage User Id", None, None, False], - ["STORAGE_BOX_SIZE", "Physical Storage", "box size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box size", None, None, False], - ["STORAGE_BOX_POSITION", "Physical Storage", "position", DataType.VARCHAR, None, "Storage Box Position", None, None, False] -]; - -# -# Experiment Types -# -experimentDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], - ["GRANT", "General", "Grant", DataType.VARCHAR, None, "grant name", None, None, False], - ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], - ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], - ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] -]; - -# -# Sample Types -# -antibodyDefinition = [ - ["NAME", "General", "antibody ID", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_ID_NR", "General", "antibody_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ANTIGEN", "General", "antigen", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_BLOCK", "General", "block facs", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_IF_BLOCK", "General", "block IFF", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_WB_BLOCK", "General", "block western", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["CATALOGUE_NUMBER", "General", "catalog id #", DataType.VARCHAR, None, "", None, None, False], - ["CLASS", "General", "class", DataType.CONTROLLEDVOCABULARY, "CLASS", "", None, None, False], - ["CLONE", "General", "clone", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ANTIBODY_FACS_CONC", "General", "conc facs", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IF_CONC", "General", "conc IFF", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IP_CONC", "General", "conc ip", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_IP", "", None, None, False], - ["ANTIBODY_WB_CONC", "General", "conc western", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_WESTERN", "", None, None, False], - ["ANTIBODY_CONCENTRATION", "General", "concentration", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_CROSSREACTIVITY", "General", "crossreactivity", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_FIX", "General", "fix facs", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_IF_FIX", "General", "fix IFF", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_WB_FIX", "General", "fix western", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LABEL", "General", "label", DataType.CONTROLLEDVOCABULARY, "LABEL", "", None, None, False], - ["LOTNUMBER", "General", "lotnumber", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MONO_POLYCLONAL", "General", "mono/polyclonal", DataType.CONTROLLEDVOCABULARY, "MONO-POLYCLONAL", "", None, None, False], - ["ANTIBODY_FACS_NOTES", "General", "notes FACS", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IF_NOTES", "General", "notes IFF", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IP_NOTES", "General", "notes IP", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_WB_NOTES", "General", "notes western", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["ANTIGEN_SIZE", "General", "size", DataType.VARCHAR, None, "", None, None, False], - ["SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "SOURCE", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["BOX", "Storage", "box", DataType.VARCHAR, None, "", None, None, False], - ["RACK", "Storage", "rack", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -cellDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR", "General", "cell_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR_COPY", "General", "cell_id_nr Copy", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], - ["CLONE", "General", "clone #", DataType.INTEGER, None, "", None, None, False], - ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC4", "General", "conc.4", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT4", "General", "concentration unit 4", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINE_NAME", "General", "line name", DataType.VARCHAR, None, "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MYCOPLASM_TESTED", "General", "mycoplasm_tested", DataType.BOOLEAN, None, "", None, None, False], - ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERS_CELL_NUMBER", "General", "PersCellNumber", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID4", "General", "sel.4", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], - ["VIRUS_ID1", "General", "virus ID 1", DataType.VARCHAR, None, "", None, None, False], - ["VIRUS_ID2", "General", "virus ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -strainDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["BACKGROUND", "General", "background", DataType.CONTROLLEDVOCABULARY, "STRAIN_BACKGROUND", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CIR", "General", "cir", DataType.CONTROLLEDVOCABULARY, "CIR", "", None, None, False], - ["CONC_INDUCER1", "General", "conc. inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER2", "General", "conc. inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER3", "General", "conc. inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DERIVATION", "General", "derivation", DataType.CONTROLLEDVOCABULARY, "DERIVATION", "", None, None, False], - ["EXPRESSED_PROTEIN1", "General", "expressed protein 1", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN2", "General", "expressed protein 2", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN3", "General", "expressed protein 3", DataType.VARCHAR, None, "", None, None, False], - ["FREE_PLASMID", "General", "freeplasmid", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GAL", "General", "gal", DataType.CONTROLLEDVOCABULARY, "GAL", "", None, None, False], - ["GENE_EXPRESSION1", "General", "gene expression 1", DataType.VARCHAR, None, "", None, None, False], - ["GENE_EXPRESSION2", "General", "gene expression 2", DataType.VARCHAR, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INDUCER1", "General", "inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER2", "General", "inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER3", "General", "inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MARKERS", "General", "markers", DataType.VARCHAR, None, "", None, None, False], - ["MAT", "General", "mat", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NUMBER", "General", "number", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_OBTAINED_FROM", "General", "obtained from", DataType.VARCHAR, None, "", None, None, False], - ["ORF", "General", "orf", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERSYEASTNUMBER", "General", "persyeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PETERYEASTNUMBER", "General", "peteryeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER1", "General", "promoter 1", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER2", "General", "promoter 2", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER3", "General", "promoter 3", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "General", "reference", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION1", "General", "sel.1", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION2", "General", "sel.2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION3", "General", "sel.3", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION", "General", "selection", DataType.CONTROLLEDVOCABULARY, "SELECTION_YEAST", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "STRAIN_SOURCE", "", None, None, False], - ["SPECIES", "General", "species", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_ID_NR", "General", "strain_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "strain ID", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_NAME", "General", "strain name", DataType.VARCHAR, None, "", None, None, False] -]; - -oligoDefinition = [ - ["AMOUNT", "General", "amount", DataType.REAL, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "OLIGO_COMPANY", "", None, None, False], - ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["GRADE", "General", "grade", DataType.CONTROLLEDVOCABULARY, "OLIGO_GRADE", "", None, None, False], - ["COMMENTS", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["OD", "General", "od", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "oligo ID", DataType.INTEGER, None, "", None, None, False], - ["OLIGO_ID_NR", "General", "oligo_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ORDER_DATE", "General", "order date", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "OLIGO_ORGANISM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_PARTNER", "General", "primer partner", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_POSITION", "General", "primer position", DataType.CONTROLLEDVOCABULARY, "PRIMER_POSITION", "", None, None, False], - ["PUBLISHED_IN", "General", "PublishedIn", DataType.VARCHAR, None, "", None, None, False], - ["RESTRICTION_SITE", "General", "restriction site", DataType.CONTROLLEDVOCABULARY, "RESTRICTION", "", None, None, False], - ["SEQUENCE", "General", "sequence", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.VARCHAR, None, "", None, None, False], - ["USAGE", "General", "usage", DataType.CONTROLLEDVOCABULARY, "OLIGO_USAGE", "", None, None, False], - ["ADENOSINE", "Calculated fields", "adenosine", DataType.INTEGER, None, "", adenosineScriptName, None, False], - ["CYTOSINE", "Calculated fields", "cytosine", DataType.INTEGER, None, "", cytosineScriptName, None, False], - ["GUANOSINE", "Calculated fields", "guanosine", DataType.INTEGER, None, "", guanosineScriptName, None, False], - ["THYMIDINE", "Calculated fields", "thymidine", DataType.INTEGER, None, "", thymidineScriptName, None, False], - ["LENGTH", "Calculated fields", "length", DataType.INTEGER, None, "", lengthScriptName, None, False], - ["GC", "Calculated fields", "gc", DataType.REAL, None, "", gcScriptName, None, False], - ["TM", "Calculated fields", "tm", DataType.REAL, None, "", tmScriptName, None, False], - ["O_NUCLEOTIDE", "Calculated fields", "O nucleotide", DataType.INTEGER, None, "", nucelotideScriptName, None, False] -]; - -plasmidDefinition = [ - ["BACKBONE", "General", "backbone", DataType.CONTROLLEDVOCABULARY, "BACKBONE", "", None, None, False], - ["BACKUP_STORAGE", "General", "backup storage", DataType.VARCHAR, None, "", None, None, False], - ["BACTERIAL_HOST", "General", "bacterial host", DataType.CONTROLLEDVOCABULARY, "BACTERIAL_HOST", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["BIOSAFETY_LEVEL", "General", "biosafety level", DataType.CONTROLLEDVOCABULARY, "BIOSAFETY_LEVEL", "", None, None, False], - ["BOXNR", "General", "boxNr", DataType.VARCHAR, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONSTRUCTION_METHOD", "General", "construction method", DataType.VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["CTERMTAG", "General", "Ctermtag", DataType.VARCHAR, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DATE_OF_CONSTRUCTION", "General", "date of construction", DataType.TIMESTAMP, None, "", None, None, False], - ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], - ["ECOLI_STRAIN", "General", "E.coli strain", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT", "General", "excise insert", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT2", "General", "excise insert 2", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["FUNCTIONAL_ELEMENTS_INSERT", "General", "functional elements insert", DataType.VARCHAR, None, "", None, None, False], - ["HYPERCARD_FILE", "General", "hypercard file", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INSERT", "General", "insert", DataType.VARCHAR, None, "", None, None, False], - ["INSERTION_SITE", "General", "insertion site", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINEARIZE", "General", "linearize", DataType.VARCHAR, None, "", None, None, False], - ["MARKER", "General", "Marker", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NAME_OF_PARENTAL_CLONE", "General", "name of parental clone", DataType.VARCHAR, None, "", None, None, False], - ["NAME_OF_VECTOR", "General", "name of vector", DataType.VARCHAR, None, "", None, None, False], - ["NTERMTAG", "General", "Ntermtag", DataType.VARCHAR, None, "", None, None, False], - ["NUCLEOTIDE_SEQUENCE", "General", "nucleotide sequence", DataType.VARCHAR, None, "", None, None, False], - ["OLIGOS_USED", "General", "oligos used", DataType.VARCHAR, None, "", None, None, False], - ["ORGANISM", "General", "organism", DataType.VARCHAR, None, "", None, None, False], - ["ORIGIN_OF_REPLICATION", "General", "origin of replication", DataType.VARCHAR, None, "", None, None, False], - ["OTHER_MARKER", "General", "other marker", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PERSPLASMIDNUM", "General", "persPlasmidnum", DataType.REAL, None, "", None, None, False], - ["PETERPLASMIDNUM", "General", "PeterPlasmidNum", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "plasmid ID", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID_NR", "General", "plasmid_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["PLASMIDNAME", "General", "plasmidname", DataType.VARCHAR, None, "", None, None, False], - ["PRIMERS", "General", "primers", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER", "General", "promoter", DataType.CONTROLLEDVOCABULARY, "PROMOTER", "", None, None, False], - ["SELECTION_IN_BACTERIA", "General", "selection in bacteria", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_BACTERIA", "", None, None, False], - ["SELECTION_IN_EUKARYOTES", "General", "selection in eukaryotes", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_EUKARYOTES", "", None, None, False], - ["SEQUENCE_FILE_NAME", "General", "sequence file name", DataType.VARCHAR, None, "", None, None, False], - ["SEQUENCING_DATE", "General", "sequencing date", DataType.TIMESTAMP, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SHELF", "General", "shelf", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_INSERT", "General", "size insert", DataType.REAL, None, "", None, None, False], - ["SIZE_OF_INSERT", "General", "size of insert", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_VECTOR", "General", "size vector", DataType.REAL, None, "", None, None, False], - ["PLASMID_SOURCE", "General", "source", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "PLASMID_ORGANISM", "", None, None, False], - #["TUBES", "General", "TUBES", DataType.VARCHAR, None, "", None, None, False], - ["URL", "Reference", "url", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "published in", DataType.VARCHAR, None, "", None, None, False] -]; - -chemicalDefinition = [ - ["ARTICLE", "General", "Article", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ARTICLE_NUM", "General", "Article Number", DataType.VARCHAR, None, "", None, None, False], - ["RECORD_NUMBER", "General", "RecordNumber", DataType.VARCHAR, None, "", None, None, False], - ["LOCATION", "Location", "Location", DataType.VARCHAR, None, "", None, None, False] -]; - -siRNADefinition = [ - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["EXON_OR_THREE_PRIME", "General", "exon or three prime", DataType.CONTROLLEDVOCABULARY, "EXON_OR_THREE_PRIME", "", None, None, False], - ["EXON", "General", "exon #", DataType.INTEGER, None, "", None, None, False], - ["3_PRIME_POSITION", "General", "3' position", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "SIRNA_SPECIES", "", None, None, False], - ["SEQUENCE", "General", "SEQUENCE", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "SIRNA_COMPANY", "", None, None, False], - ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.REAL, None, "", None, None, False], - ["WORKING_CONCENTRATION", "General", "Working concentration", DataType.REAL, None, "", None, None, False], - ["EFFICIENCY", "General", "Efficiency", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_QPCR", "General", "Efficiency_qPCR", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_WESTERN", "General", "Efficiency_Western", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_OTHER", "General", "Efficiency_other", DataType.VARCHAR, None, "", None, None, False], - ["OFF_TARGET_EFFECTS", "General", "Off target effects", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["SPECIFIC_SPLICE_VARIANT", "General", "Specific splice variant", DataType.VARCHAR, None, "", None, None, False], - ["TRANSFECTION_AGENT", "General", "Transfection agent", DataType.CONTROLLEDVOCABULARY, "TRANSFECTION_AGENT", "", None, None, False], - ["LIBRARY", "General", "Library", DataType.VARCHAR, None, "", None, None, False], - ["CHARACTERIZED_BY_COMPANY", "General", "Characterized by company", DataType.VARCHAR, None, "", None, None, False], - ["NUMBERINPOOL", "General", "NumberINpool", DataType.INTEGER, None, "", None, None, False], - ["TEST", "General", "Test", DataType.VARCHAR, None, "", None, None, False], - ["CHEMICAL_MODIFICATION", "General", "Chemical modification", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_OLIGONUMBER", "General", "siRNA_OligoNumber", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_FREEZER_LOCATION", "General", "Freezer Location", DataType.CONTROLLEDVOCABULARY, "SIRNA_FREEZER_LOCATION", "", None, None, False], - ["DRAWER", "General", "Drawer", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED", "Reference", "Published", DataType.VARCHAR, None, "", None, None, False] -]; - -# -# Data Set Types -# -documentDefinition = [ - ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["ID_NR", "General", "id_nr", DataType.VARCHAR, None, "", None, None, False], - ["FILE", "General", "file", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL", "General", "serial", DataType.INTEGER, None, "", None, None, False] - -]; diff --git a/plasmid/source/core-plugins/petermigration/1/as/definitionsVoc.py b/plasmid/source/core-plugins/petermigration/1/as/definitionsVoc.py deleted file mode 100644 index 3548fcc6f4d1bc87c3af24af4efaf626f84b14a2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/as/definitionsVoc.py +++ /dev/null @@ -1,854 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "ALL_LAB_MEMBERS" : [ - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["BRIAN_LUKE", "Brian Luke"], - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["CELINE_LAFOURCADE", "Celine Lafourcade"], - ["CHRISTINE_RUPP", "Christine Rupp"], - ["CLAUDINE_KRAFT", "Claudine Kraft"], - ["EDYTA_SIERGIEJUK", "Edyta Siergiejuk"], - ["FABIAN_HERZOG", "Fabian Herzog"], - ["FABIAN_RUDOLF", "Fabian Rudolf"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["GWEN_RABUT", "Gw\xe9nael Rabut"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["IRAM_ZAIDI", "Iram Zaidi"], - ["IZABELA_SUMARA", "Izabela Sumara"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["MALIKAJAQUENOUD", "MalikaJaquenoud"], - ["MARC_SOHRMANN", "Marc Sohrmann"], - ["MARIE-LYN_HECHT", "Marie-Lyn Hecht"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["MICHAEL_OLMA", "Michael Olma"], - ["MICHAEL_SCHNEIDER", "Michael Schneider"], - ["MICHELE_KNAUS", "Michele Knaus"], - ["MONIKA_GERSBACH", "Monika Gersbach"], - ["NATHALIE_MEYER-SCHALLER", "Nathalie Meyer-Schaller"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["NICOLAS_DARD", "Nicolas Dard"], - ["NICOLAS_PAGE", "Nicolas Page"], - ["PATRICK_PEDRIOLI", "Patrick Pedrioli"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["PIERRE_MAILLARD", "Pierre Maillard"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["SANDER_SPRINGER", "Sander Springer"], - ["SARAH_GLASER", "Sarah Glaser"], - ["SARAH_MAERKI", "Sarah M\xe4rki"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["SERGE_PELET", "Serge Pelet"], - ["STEFAN_MUELLER", "Stefan M�ller"], - ["TANIA_ROBERTS", "Tania Roberts"], - ["THIMO_KURZ", "Thimo Kurz"], - ["TOBIAS_BRAUN", "Tobias Braun"], - ["VANESSA_REZGUI", "Vanessa Rezgui"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["YVONNE_GLOOR", "Yvonne Gloor"], - ["JOCHEN_BECK", "Jochen Beck"], - ["MONIKA_KIJANSKA", "Monika Kijanska"], - ["ANGIE_RAGHEB", "Angie Ragheb"], - ["ANNE_PACQUELET", "Anne Pacquelet"], - ["BJORN_HEGEMANN", "Bj\xf6rn Hegemann"], - ["JANNY_TILMA", "Janny Tilma"], - ["THIBAULT_COURTHEOUX", "Thibault Courtheoux"], - ["SAMUEL_GILBERTO", "Samuel Gilberto"], - ["REMY_BUSER", "Remy Buser"], - ["RADOSLAV_ENCHEV", "Radoslav Enchev"], - ["MICHAELA_HUBNER", "Michaela Hubner"], - ["MIA_LI", "Mia Li"], - ["JULIEN_MOUYSSET", "Julien Mouysset"] - ], - "LAB_MEMBERS_INITIALS" : [ - ["AD", "AD"], - ["ACB", "ACB"], - ["BL", "BL"], - ["CZ", "CZ"], - ["CL", "CL"], - ["CR", "CR"], - ["CK", "CK"], - ["ES", "ES"], - ["FH", "FH"], - ["FR", "FR"], - ["FD", "FD"], - ["GJ", "GJ"], - ["GR", "GR"], - ["ISS", "ISS"], - ["IZ", "IZ"], - ["IS", "IS"], - ["LP", "LP"], - ["MJ", "MJ"], - ["MSO", "MSo"], - ["MH", "MH"], - ["MG", "MG"], - ["MP", "MP"], - ["MO", "MO"], - ["MSC", "MSc"], - ["MK", "MK"], - ["MG", "MG"], - ["NS", "NS"], - ["NPE", "NPe"], - ["ND", "ND"], - ["NPA", "NPa"], - ["PP", "PP"], - ["PW", "PW"], - ["PM", "PM"], - ["RD", "RD"], - ["SS", "SS"], - ["SG", "SG"], - ["SMA", "SMa"], - ["SL", "SL"], - ["SP", "SP"], - ["SM", "SM"], - ["TR", "TR"], - ["TK", "TK"], - ["TB", "TB"], - ["VR", "VR"], - ["WP", "WP"], - ["YS", "YS"], - ["YG", "YG"], - ["JB", "JB"], - ["MKI", "MKi"] - ], - "BLOCK" : [ - ["1BSA_01TRITON-X100", "1% BSA; 0.1% Triton-X100"], - ], - "CLASS" : [ - ["IGM", "IgM"], - ["IGG1", "IgG1"], - ["IGG2", "IgG2"] - ], - "COMPANY" : [ - ["ABCAM", "abcam"], - ["CELL_SIGNALING", "cell signaling"], - ["STRATAGEN", "stratagene"], - ["CLONTECH", "clontech"], - ["UBI", "ubi"], - ["SOUTHERN_BIOTECH", "southern biotech"], - ["PIERCE", "pierce"], - ["PHARMIGEN", "pharmingen"], - ["MOLECULAR_PROBES", "molecular probes"], - ["PHARMACIA", "pharmacia"], - ["BIORAD", "biorad"], - ["EUROGENETIC", "eurogentec"], - ["HOMEMADE", "homemade"], - ["BD_BIOSCIENCE", "BD bioscience"], - ["OBTAINED_FROM", "obtained from "], - ["ZYMED", "Zymed"], - ["UNKNOWN", "Unknown"], - ["SANTA_CRUZ", "Santa Cruz"], - ["BIOLEGEND", "Biolegend"], - ["BETHYL", "Bethyl"], - ["UPSTATE", "Upstate"], - ["ROCKLAND", "Rockland"], - ["NOVUS_BIOLOGICALS", "Novus Biologicals"], - ["CHEMICON_INTERNATIONAL", "Chemicon International"], - ["SIGMA", "Sigma"], - ["ALPHA_DIAGNOSTIC_INTERNATIONAL", "Alpha Diagnostic International"], - ["MILLIPORE", "Millipore"], - ["ACTIVE_MOTIF", "Active motif"], - ["NEB", "NEB"], - ["NEOMARKERS", "Neomarkers"], - ["LUBIOSCIENCE", "LubioScience"], - ["EBIOSCIENCE", "eBioscience"], - ["INVITROGEN", "Invitrogen"], - ["STRESSGEN", "Stressgen"], - ["COVANCE", "Covance"], - ["ENZO_LIFE_SCIENCES", "Enzo Life Sciences"], - ["CALBIOCHEM", "Calbiochem"], - ["ROCHE", "Roche"], - ["CYTOSKELETON", "Cytoskeleton"], - ["OPEN_BIOSYSTEMS", "Open Biosystems"], - ["BD_TRANSDUCTION", "BD Transduction"], - ["ATLAS_ANTIBODIES_AB", "Atlas Antibodies AB"], - ["GENENTECH", "Genentech"], - ["TRANSDUCTION_LABS", "Transduction Labs"], - ["ANTIBODIES_INCORPORATED", "Antibodies Incorporated"], - ["BABCO", "BAbCO"], - ["ERICH_NIGG_LAB_BASEL", "Erich Nigg lab (Basel)"], - ["FRANCIS_BARR", "Francis Barr"], - ["AVIVA_SYSTEMS_BIOLOGY", "Aviva Systems Biology"], - ["LUCERNACHEM", "LucernaChem"], - ["LI-COR", "LI-COR"], - ["ABGENT", "Abgent"], - ["CHROMOTEK", "Chromotek"], - ["ABNOVA", "Abnova"], - ["UNKNOWN", "Unknown"], - ["ABSEA", "Absea"], - ["GE_HEALTHCARE", "GE Healthcare"], - ["GRAMSCH_LABORATORIES", "Gramsch Laboratories"], - ["ADIPOGEN", "Adipogen"], - ["COSMO_BIO_CO", "Cosmo bio co."], - ["BECKTON_DICKINSON", "Beckton Dickinson"], - ["BIOTIUM", "Biotium"] - ], - "CONCENTRATION_FACS" : [ - ["1_TO_10", "1 : 10"], - ["1_TO_20", "1 : 20"], - ["1_TO_30", "1 : 30"], - ["1_TO_40", "1 : 40"], - ["1_TO_50", "1 : 50"], - ["1_TO_100", "1 : 100"], - ["1_TO_200", "1 : 200"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_IP" : [ - ["1UL", "1 �l"], - ["5UL", "5 �l"], - ["10UL", "10 �l"], - ["15UL", "15 �l"], - ["20UL", "20 �l"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_WESTERN" : [ - ["1_TO_100", "1 : 100"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["1_TO_5000", "1 : 5000"], - ["1_TO_10000", "1 : 10000"], - ["1_TO_20000", "1 : 20000"], - ["1_TO_25000", "1 : 25000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CURRENT_LAB_MEMBERS" : [ - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["JOCHEN_BECK", "Jochen Beck"] - ], - "FIX" : [ - ["1H-RT", "1h, RT"], - ["PTEMF", "PTEMF"], - ["PFA", "PFA"], - ["MEOH", "MeOH"] - ], - "LABEL" : [ - ["HRP", "hrp"], - ["AP", "ap"], - ["FITC", "fitc"], - ["CY3", "Cy3"], - ["ALEXA647", "Alexa 647"] - ], - "ANTIBODY_LOCATION" : [ - ["SMALL_PETER_LAB", "Small Peter Lab"], - ["BIG_PETER_LAB", "Big Peter Lab"], - ["NEW_PETER_LAB", "New Peter Lab"], - ["MINUS20_C-FLOOR", "-20C C-Floor"] - ], - "MONO-POLYCLONAL" : [ - ["MONOCLONAL", "Monoclonal"], - ["POLYCLONAL", "Polyclonal"], - ["UNKNOWN", "Unknown"] - ], - "SOURCE" : [ - ["MOUSE", "Mouse"], - ["RABBIT", "Rabbit"], - ["HAMSTER", "Hamster"], - ["GOAT", "Goat"], - ["RAT", "Rat"], - ["CHICKEN", "Chicken"], - ["SHEEP", "Sheep"], - ["HUMAN", "Human"], - ["GUINEA_PIG", "Guinea pig"], - ["DONEKY", "Donkey"], - ["UNKNOWN", "Unknown"] - ], - "CELL_LOCATION" : [ - ["FRIDGE", "fridge"], - ["FREEZER", "freezer"], - ["REFCO", "refco"], - ["TANK", "tank"] - ], - "SELECTION" : [ - ["NEOMYCIN_G418", "Neomycin/G418"], - ["HYGROMYCIN", "Hygromycin"], - ["MPA", "MPA"], - ["G418", "G418"], - ["PUROMYCIN", "puromycin"], - ["BLASTICIDIN", "Blasticidin"], - ["ZEOCIN", "Zeocin"] - ], - "CO2" : [ - ["5", "5"], - ["7.5", "7.5"] - ], - "GROWTH_TEMPERATURE" : [ - ["37", "37"], - ["28", "28"], - ["34", "34"] - ], - "MEDIUM" : [ - ["RPMI1640", "RPMI 1640"], - ["ISCOVES", "Iscoves"], - ["DMEM", "DMEM"], - ["LB", "LB"], - ["DMEM_NUTRIENT", "DMEM nutrient mixture F-12 HAM [D8437]"] - ], - "CELL_OBTAINED_FROM" : [ - ["FREIBURG", "Freiburg"], - ["ATCC", "ATCC"], - ["DANIEL_GERLICH", "Daniel Gerlich"], - ["ERICH_NIGG", "Erich Nigg"], - ["KREK", "Krek"], - ["TONY_HEYMAN", "Tony Heyman"], - ["THOMAS-WILD_ULRIKE-KUTAY", "Thomas Wild/Ulrike Kutay"], - ["JAN_MICHAEL_PETERS", "Jan-Michael Peters"], - ["M_BRANDEIS", "M Brandeis"], - ["ARI_HELENIUS", "Ari Helenius"], - ["ROMEO_RICCI", "Romeo Ricci"] - ], - "CELL_SPECIES" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["CHINESE_HAMSTER", "chines hamster"], - ["HYBRIDOMA", "hybridoma (human & mouse)"] - ], - "CONC_UNITS" : [ - ["MICROG_MICROL", "�g/�l"], - ["MG_ML", "mgl/ml"], - ["UG_ML", "ug/ml"] - ], - "STRAIN_SOURCE" : [ - ["F_CHANG", "F. Chang"], - ["J_CHANT", "J. Chant"], - ["R_DESHAIES", "R. Deshaies"], - ["E_ELION", "E. Elion"], - ["P_HIETER", "P. Hieter"], - ["I_HERSKOWITZ", "I. Herskowitz"], - ["A_NEIMAN", "A. Neiman"], - ["P_SORGER", "P. Sorger"], - ["T_STEARNS", "T. Stearns"], - ["MARC_BONDEL", "Marc Bondel"], - ["G_SUMARA", "G. Sumara"], - ["MICHAEL_ALTMANN", "Michael Altmann"], - ["HETEROZYGOUS_DIPLOID_COLLECTION", "Heterozygous diploid collection"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["ANNE_PAQUELET", "Anne Paquelet"], - ["YAGMUR-TURGAY_KUTAY-GROUP", "Yagmur Turgay - Kutay group"], - ["BARBAR_CATARIN", "Barbar Catarin"], - ["FRANK_VAN-DROGEN", "Frank van Drogen"], - ["HEMMO_MEYER", "Hemmo Meyer"], - ["JEAN-MARC_GALLAND", "Jean-Marc Galland"], - ["JEFF_PARVIN", "Jeff Parvin"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MIKIKO_TAKAHASHI", "Mikiko Takahashi"], - ["SANDRA_HENCHOZ", "Sandra Henchoz"], - ["MALIKA_JAQUENOUD", "Malika Jaquenoud"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["CELINE_LAFOURCADE", "Céline Lafourcade"], - ["CELINE_LONGARETTI", "Céline Longaretti"], - ["BRIAN_LUKE", "Brian Luke"], - ["GUY_NIEDERHAUSER", "Guy Niederhäuser"], - ["NICOLAS_PAGE", "Nicolas Pag�"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["AUDREY_PETIT", "Audrey Petit"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["VOLKER_STUCKE", "Volker Stucke"], - ["KATRIN_PETER", "Katrin Peter"], - ["MARC_BLONDEL", "marc blondel"], - ["M_FUNK", "M. Funk"], - ["ATTILA_BECSKEI", "Attila Becskei"], - ["GWENAEL_RABUT", "Gwenael Rabut"], - ["PHILIP_JERMANN", "Philip Jermann"], - ["P_PRYCIAK", "P.Pryciak"], - ["LINDA_HICKE", "Linda Hicke"], - ["RZPD", "RZPD"], - ["OPENBIO", "OpenBio"], - ["F_POSAS", "F. Posas"], - ["HAPLOID_COLLECTION", "Haploid collection"], - ["MIRIAM_BORTFELD", "Miriam Bortfeld"], - ["EUROSCARF", "Euroscarf"], - ["TS_COLLECTION", "ts collection"], - ["CONZELMANN_LAB", "Conzelmann lab"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["BIBOU", "Bibou"], - ["MARC_SOHRMANN", "Marc sohrmann"] - ], - "SELECTION_YEAST" : [ - ["NONE", "None"], - ["URA", "Ura"], - ["LEU", "Leu"], - ["TRP", "Trp"], - ["HIS", "His"], - ["VIABILITY", "Viability"], - ["NAT", "nat"], - ["KAN", "kan"], - ["KAN_NAT", "kan + nat"], - ["HIS_KAN", "HIS + kan"], - ["HIS_KAN_NAT", "HIS + kan + nat"], - ["HIS", "HIS"], - ["LEU_NAT", "leu + nat"], - ["ADE2", "ade2"] - ], - "DERIVATION" : [ - ["GAMMA_INTEG", "gamma integ"], - ["DELTA_INTEG", "� integ"], - ["5FAO_LOOPOUT", "5-FAO loopout"], - ["PLASMID_SHUFFLE", "plasmid shuffle"], - ["TETRAD", "tetrad"], - ["LOOP-IN_LOOP-OUT", "loop-in/loop-out"], - ["GALPHO", "GalpHO mating type switch"], - ["DELETION", "Deletion"], - ["INTEGRATION", "Integration"] - ], - "STRAIN_BACKGROUND" : [ - ["W303", "W303"], - ["K699", "K699"], - ["K700", "K700"], - ["S288C", "S288C"], - ["1278", "*1278*"], - ["EG123", "EG123"], - ["DF5", "DF5"], - ["SIGMA", "Sigma"], - ["UNKNOWN", "Don't know"], - ["BY7092", "BY7092"], - ["BY5565", "BY5565"], - ["BY4741", "BY4741"] - ], - "CIR" : [ - ["CIR_PLUS", "cir+"], - ["CIR_DEG", "cir�"], - ], - "GAL" : [ - ["PLUS", "Plus"], - ["PLUS_PLUS", "Plus/Plus"], - ["GAL1", "gal1"], - ["GAL1_GAL1", "gal1/gal1"], - ["GAL2", "gal2"], - ["GAL2_GAL2", "gal2/gal2"], - ], - "MAT" : [ - ["AT", "@"], - ["A", "a"], - ["ALPHA", "alpha"], - ["DIPLOID", "diploid"], - ["UNKNOWN", "unknown"] - ], - "OLIGO_ORGANISM" : [ - ["BMV", "BMV"], - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"], - ["HIV1", "HIV-1"], - ["CELEGANS", "C.elegans"], - ["MYCOPLASMA", "mycoplasma"] - ], - "OLIGO_GRADE" : [ - ["DESALTED", "desalted"], - ["HPLC", "hplc"], - ["PURITY", "purity"], - ["UNKNOWN", "?"] - ], - "PRIMER_POSITION" : [ - ["FORWARD", "forward"], - ["REVERSE", "reverse"] - ], - "OLIGO_COMPANY" : [ - ["MWG", "MWG"], - ["BIG", "BIG"], - ["PHARMACIA", "Pharmacia"], - ["IGLOI", "Igloi"], - ["INVITROGEN", "invitrogen"], - ["MICROSYNTH", "microsynth"] - ], - "OLIGO_USAGE" : [ - ["PCR", "pcr"], - ["SEQUENCING", "sequencing"], - ["HYBRIDIZE", "hybridize"], - ["MUTAGENESIS", "mutagenesis"], - ["RT-PCR", "Real-Time PCR"] - ], - "RESTRICTION" : [ - ["AATII", "AatII"], - ["ACCI", "AccI"], - ["ACII", "AciI"], - ["AFLII", "AflII"], - ["AFLIII", "AflIII"], - ["AGEI", "AgeI"], - ["ALUI", "AluI"], - ["ALWI", "AlwI"], - ["ALWNI", "AlwNI"], - ["APAI", "ApaI"], - ["APALI", "ApaLI"], - ["APOI", "ApoI"], - ["ASCI", "AscI"], - ["ASEI", "AseI"], - ["AVAI", "AvaI"], - ["AVAII", "AvaII"], - ["AVRII", "AvrII"], - ["BAMHI", "BamHI"], - ["BANI", "BanI"], - ["BANII", "BanII"], - ["BBSI", "BbsI"], - ["BBVI", "BbvI"], - ["BCGI-1", "BcgI-1"], - ["BCGI-2", "BcgI-2"], - ["BCLI", "BclI"], - ["BFAI", "BfaI"], - ["BGLI", "BglI"], - ["BGLII", "BglII"], - ["BLPI", "BlpI"], - ["BPMI", "BpmI"], - ["BSAAI", "BsaAI"], - ["BSABI", "BsaBI"], - ["BSAHI", "BsaHI"], - ["BSAI", "BsaI"], - ["BSAJI", "BsaJI"], - ["BSAWI", "BsaWI"], - ["BSERI", "BseRI"], - ["BSGI", "BsgI"], - ["BSIEI", "BsiEI"], - ["BSIHKAI", "BsiHKAI"], - ["BSIWI", "BsiWI"], - ["BSLI", "BslI"], - ["BSMAI", "BsmAI"], - ["BSMBI", "BsmBI"], - ["BSMFI", "BsmFI"], - ["BSMI", "BsmI"], - ["BSOFI", "BsoFI"], - ["BSP1286I", "Bsp1286I"], - ["BSPEI", "BspEI"], - ["BSPHI", "BspHI"], - ["BSPMI", "BspMI"], - ["BSRBI", "BsrBI"], - ["BSRDI", "BsrDI"], - ["BSRFI", "BsrFI"], - ["BSRGI", "BsrGI"], - ["BSRI", "BsrI"], - ["BSSHII", "BssHII"], - ["BST1107I", "Bst1107I"], - ["BSTBI", "BstBI"], - ["BSTEII", "BstEII"], - ["BSTNI", "BstNI"], - ["BSTUI", "BstUI"], - ["BSTXI", "BstXI"], - ["BSTYI", "BstYI"], - ["BSU36I", "Bsu36I"], - ["CAC8I", "Cac8I"], - ["CLAI", "ClaI"], - ["CVIJI", "CviJI"], - ["DDEI", "DdeI"], - ["DPNI", "DpnI"], - ["DRAI", "DraI"], - ["DRAIII", "DraIII"], - ["DRDI", "DrdI"], - ["DSAI", "DsaI"], - ["EAEI", "EaeI"], - ["EAGI", "EagI"], - ["EAM1105I", "Eam1105I"], - ["EARI", "EarI"], - ["ECO47III", "Eco47III"], - ["ECO57I", "Eco57I"], - ["ECONI", "EcoNI"], - ["ECOO109I", "EcoO109I"], - ["ECORI", "EcoRI"], - ["ECORV", "EcoRV"], - ["FOKI", "FokI"], - ["FSEI", "FseI"], - ["FSPI", "FspI"], - ["HAEII", "HaeII"], - ["HAEIII", "HaeIII"], - ["HGAI", "HgaI"], - ["HHAI", "HhaI"], - ["HINCII", "HincII"], - ["HINDIII", "HindIII"], - ["HINFI", "HinfI"], - ["HPAI", "HpaI"], - ["HPAII", "HpaII"], - ["HPHI", "HphI"], - ["KPNI", "KpnI"], - ["MAEII", "MaeII"], - ["MAEIII", "MaeIII"], - ["MBOI", "MboI"], - ["MBOII", "MboII"], - ["MLUI", "MluI"], - ["MNLI", "MnlI"], - ["MSCI", "MscI"], - ["MSEI", "MseI"], - ["MSLI", "MslI"], - ["MSPA1I", "MspA1I"], - ["MUNI", "MunI"], - ["MWOI", "MwoI"], - ["NAEI", "NaeI"], - ["NARI", "NarI"], - ["NCII", "NciI"], - ["NCOI", "NcoI"], - ["NDEI", "NdeI"], - ["NHEI", "NheI"], - ["NLAIII", "NlaIII"], - ["NLAIV", "NlaIV"], - ["NOTI", "NotI"], - ["NRUI", "NruI"], - ["NSII", "NsiI"], - ["NSPI", "NspI"], - ["PACI", "PacI"], - ["PFLMI", "PflMI"], - ["PLEI", "PleI"], - ["PMEI", "PmeI"], - ["PMLI", "PmlI"], - ["PPUMI", "PpuMI"], - ["PSHAI", "PshAI"], - ["PSP1406I", "Psp1406I"], - ["PSTI", "PstI"], - ["PVUI", "PvuI"], - ["PVUII", "PvuII"], - ["RSAI", "RsaI"], - ["RSRII", "RsrII"], - ["SACI", "SacI"], - ["SACII", "SacII"], - ["SALI", "SalI"], - ["SAPI", "SapI"], - ["SAU96I", "Sau96I"], - ["SCAI", "ScaI"], - ["SCRFI", "ScrFI"], - ["SEXAI", "SexAI"], - ["SFANI", "SfaNI"], - ["SFCI", "SfcI"], - ["SFII", "SfiI"], - ["SGFI", "SgfI"], - ["SGRAI", "SgrAI"], - ["SMAI", "SmaI"], - ["SNABI", "SnaBI"], - ["SPEI", "SpeI"], - ["SPHI", "SphI"], - ["SRFI", "SrfI"], - ["SSE8387I", "Sse8387I"], - ["SSPI", "SspI"], - ["STUI", "StuI"], - ["STYI", "StyI"], - ["SWAI", "SwaI"], - ["TAQI", "TaqI"], - ["TFII", "TfiI"], - ["TSP45I", "Tsp45I"], - ["TSP509I", "Tsp509I"], - ["TTH111I", "Tth111I"], - ["XBAI", "XbaI"], - ["XCMI", "XcmI"], - ["XHOI", "XhoI"], - ["XMNI", "XmnI"], - ["SACI_NHEI", "sacI NheI"], - ["XMAI", "XmaI"], - ["BAMHI", "BamHI"], - ["CLAI", "ClaI"], - ["PACI", "PacI"], - ["NOTI", "NotI"], - ["SALI", "SalI"], - ["XHOI", "XhoI"], - ["NONE", "none"] - ], - "BACKBONE" : [ - ["PCDNA3", "pCDNA3"], - ["PABES-NEO2000", "pABES-neo 2000"], - ["PUC19", "pUC 19"], - ["PMX-1", "pMX-1"], - ["PRMHA-3", "pRmHa-3"] - ], - "BACTERIAL_HOST" : [ - ["DH10B", "DH10B"], - ["JM110", "JM110"], - ["BL21", "BL21"], - ["DH5A", "DH5a"], - ["PB3", "PB3"], - ["DB31", "DB3.1"], - ["CCDB_SURVIVAL", "ccdB survival"] - ], - "BIOSAFETY_LEVEL" : [ - ["S1", "S1"], - ["S2", "S2"], - ["S3", "S3"] - ], - "SELECTION_IN_BACTERIA" : [ - ["AMPICILLIN", "Ampicillin"], - ["KANAMYCIN", "Kanamycin"], - ["SPECTINOMCIN", "Spectinomcin"], - ["UNKNOWN", "Unknown"] - ], - "SELECTION_IN_EUKARYOTES" : [ - ["G418_NEO", "G418/neo"], - ["MPA", "MPA"], - ["HYGROMYCIN", "Hygromycin"] - ], - "SOURCE_OF_REPLICON" : [ - ["CMV", "CMV"] - ], - "PLASMID_ORGANISM" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"] - ], - "PROMOTER" : [ - ["ENDOGENOUS", "endogenous"], - ["GAL1", "gal1"], - ["GALL", "galL"], - ["GALS", "galS"], - ["TET", "tet"], - ["ADH", "adh"], - ["CYC", "cyc"], - ["GPD", "gpd"], - ["DASH", "\"-\""], - ["CMV", "cmv"], - ["SV40", "SV40"], - ["TET_ON", "tet on"], - ["TET_OFF", "tet off"], - ["RIM1", "rim1"] - ], - "EXON_OR_THREE_PRIME" : [ - ["EXON", "exon"], - ["3P", "3'"], - ["5P", "5'"] - ], - "SIRNA_SPECIES" : [ - ["HUMAN", "Human"], - ["MOUSE", "Mouse'"], - ], - "SIRNA_COMPANY" : [ - ["AMBION", "Ambion"], - ["DHARMACON", "Dharmacon'"], - ["INVITORGEN", "Invitrogen'"], - ["MICROSYNTH", "Microsynth'"], - ["QIAGEN", "Qiagen'"], - ["GIFT", "Gift'"] - ], - "SIRNA_FREEZER_LOCATION" : [ - ["BIGLABFREEZER", "BigLab freezer"], - ["SMALLLAB_BIGFREEZER", "SmallLab Big freezer'"], - ["FREEZER_G17", "Freezer G17'"], - ["G93-FRANK", "G9.3--Frank'"], - ["FREEZER-G17_BOX_NATHALIE", "Freezer G17 Box Nathalie'"], - ["BOX-THIBAULT-BIGFREEZER-SMALLLAB", "Box thibault Big freezer small lab'"], - ["BOX-NATHALIE", "Box Nathalie'"] - ], - "TRANSFECTION_AGENT" : [ - ["FUGENE", "Fugene"], - ["LIPOFECTAMINE", "Lipofectamine'"], - ["OLIGOFECTAMINE", "Oligofectamine'"], - ["RNAIMAX", "RNAimax'"] - ], - "FREEZER" : [ - ["G9_FRIDGE-1", "G9 Fridge 1"], - ["G9_FRIDGE-2", "G9 Fridge 2"], - ["G9_FREEZER-A", "-20C Small Peter Lab"], - ["G9_FREEZER-B", "G9 Freezer B"], - ["G9_FREEZER-C", "G9 Freezer C"], - ["G10_FREEZER-D", "G10 Freezer D"], - ["G10_FREEZER-E", "G10 Freezer E"], - ["G10_FREEZER-F", "G10 Freezer F"], - ["G10_FREEZER-G", "G10 Freezer G"], - ["G10_FREEZER-H", "G10 Freezer H"], - ["G10_FREEZER-I", "G10 Freezer I"], - ["G10_FRIDGE-3", "+4C Big Peter Lab"], - ["G10_FRIDGE-4", "G10 Fridge 4"], - ["G10_FRIDGE-5", "G10 Fridge 5"], - ["G10_FRIDGE-6", "G10 Fridge 6"], - ["G10_FRIDGE-7", "G10 Fridge 7"], - ["G11_FRIDGE-8", "G10 Fridge 8"], - ["G14_FREEZER-J", "G14 Freezer J"], - ["G14_FREEZER-K", "G14 Freezer K"], - ["G14_FREEZER-L", "G14 Freezer L"], - ["G14_FREEZER-M", "G14 Freezer M"], - ["G14_FRIDGE-9", "G14 Fridge 9"], - ["G14_FRIDGE-10", "G14 Fridge 10"], - ["G17_FRIDGE-11", "G17 Fridge 11"], - ["G17_FRIDGE-12", "G17 Fridge 12"], - ["G17_FREEZER-N", "G17 Freezer N"], - ["USER_BENCH-20", "Bench -20�C"], - ["USER_BENCH-80", "Bench -80�C"], - ["USER_BENCH-RT", "Bench RT"], - ["USER_BENCH", "Bench"] - ], - "STORAGE_BOX_SIZE" : [ - ["9X9", "9 x 9 box"], - ["8X8", "8 x 8 box"], - ["5X5", "5 x 5 box"], - ["10X10", "10 x 10 box"], - ["10X5", "10 x 5 box"], - ["10X12", "10 x 12 box"] - ], - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/as/initialize-master-data.py b/plasmid/source/core-plugins/petermigration/1/as/initialize-master-data.py deleted file mode 100644 index 9b5cffbdd1cff6cbded5234eaf3eaa055b68264f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/as/initialize-master-data.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -## -## Configuration -## -PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/juanf/Documents/workspace/openbis/source/core-plugins/petermigration/1/compatibility/"; -#PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/barillac/openbis-peter/servers/core-plugins/petermigration/1/compatibility/"; - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.createNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - -def createDataSetTypeWithProperties(dataSetCode, description, properties): - newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); - newDataSet.setDescription(description); - addProperties(newDataSet, properties); - -def createExperimentTypeWithProperties(experimentTypeCode, description, properties): - newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); - newExperiment.setDescription(description); - addProperties(newExperiment, properties); - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = samplesCache[sampleTypeCode]; - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - addProperty(entity, property[0], property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8]); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); - propertyAssignment.setSection(section); - propertyAssignment.setMandatory(isMandatory); - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setShownEdit(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(True); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -def addStorageGroups(numGroups, sampleType): - for storageIdx in range(1,(numGroups + 1)): - storageGroup = definitions.getStorageGroupDefinition(); - for property in storageGroup: - property[0] = property[0] + "_" + str(storageIdx); - property[1] = property[1] + " " + str(storageIdx); - property[2] = property[2] + " " + str(storageIdx); - property[5] = property[5] + " " + str(storageIdx); - addPropertiesToSamples([sampleType], storageGroup); - -#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION -def createScript(path, name, description, scriptType, entityType): - scriptAsString = open(path, 'r').read(); - script = tr.getOrCreateNewScript(name); - script.setName(name); - script.setDescription(description); - script.setScript(scriptAsString); - script.setScriptType(scriptType); - script.setEntityForScript(entityType); - return script; - -## -## Managed properties scripts -## -commentsScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "comments.py", - definitions.commentsScriptName, - "Comments Handler", - "MANAGED_PROPERTY", - "SAMPLE"); - -## -## Dynamic properties scripts -## -adenosineScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "adenosine_count.py", - definitions.adenosineScriptName, - "Count number of adenosine in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -cytosineScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "cytosine_count.py", - definitions.cytosineScriptName, - "Count number of cytosine in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -gcScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "gc.py", - definitions.gcScriptName, - "(guanosine+cytosine)*100/length", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -guanosineScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "guanosine_count.py", - definitions.guanosineScriptName, - "Count number of guanosine in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -lengthScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "length.py", - definitions.lengthScriptName, - "Count total length of sequence (A+C+T+G+O_nucleotide)", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -nucelotideScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "nucleotide_count.py", - definitions.nucelotideScriptName, - "Count number of r,y,m,k,s,w,h,b,d,x,N in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -thymidineScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "thymidine_count.py", - definitions.thymidineScriptName, - "Count number of thymidine in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -tmScript = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "tm.py", - definitions.tmScriptName, - "68.3 + (0.41 * gc) - (600/length)", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -## -## Vocabulary Types -## -for vocabularyCode, vocabularyValues in definitionsVoc.vocabularyDefinitions.iteritems(): - createVocabularyWithTerms(vocabularyCode, vocabularyValues) - -## -## Experiment Types -## -createExperimentTypeWithProperties("DEFAULT_EXPERIMENT", "Default Experiment", definitions.experimentDefinition); -createExperimentTypeWithProperties("ANTIBODY", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("CELL", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("STRAIN", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("PLASMID", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("CHEMICAL", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("SIRNA", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); -createExperimentTypeWithProperties("OLIGO", "BOX TO HOLD SAMPLES OF THIS TYPE FOR ORGANIZATIONAL PURPOSES", []); - -## -## Sample Types -## -createSampleTypeWithProperties("ANTIBODY", "", definitions.antibodyDefinition); -addStorageGroups(definitions.numberOfStorageGroups, "ANTIBODY"); -createSampleTypeWithProperties("CELL", "", definitions.cellDefinition); -addStorageGroups(definitions.numberOfStorageGroups, "CELL"); -createSampleTypeWithProperties("STRAIN", "", definitions.strainDefinition); -addStorageGroups(definitions.numberOfStorageGroups, "STRAIN"); -createSampleTypeWithProperties("PLASMID", "", definitions.plasmidDefinition); -addStorageGroups(definitions.numberOfStorageGroups, "PLASMID"); -createSampleTypeWithProperties("OLIGO", "", definitions.oligoDefinition); -addStorageGroups(definitions.numberOfStorageGroups, "OLIGO"); -createSampleTypeWithProperties("CHEMICAL", "", definitions.chemicalDefinition); -createSampleTypeWithProperties("SIRNA", "", definitions.siRNADefinition); - -## -## Data set Types -## -createDataSetTypeWithProperties("DOCUMENT", "", definitions.documentDefinition); diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/adenosine_count.py b/plasmid/source/core-plugins/petermigration/1/compatibility/adenosine_count.py deleted file mode 100644 index 58363afbe1c2b60133113de10b140a4ace143e99..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/adenosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('A')+entity.propertyValue('SEQUENCE').count('a') \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/comments.py b/plasmid/source/core-plugins/petermigration/1/compatibility/comments.py deleted file mode 100644 index 02c50d2364afd8bf0dce2d50297c6bff2ccb35bf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/comments.py +++ /dev/null @@ -1,174 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [COMMENT_ENTRY_ELEMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - comment_text_list = item.get('COMMENTENTRY') - sampleLink = _createCommentEntry(comment_text_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/cytosine_count.py b/plasmid/source/core-plugins/petermigration/1/compatibility/cytosine_count.py deleted file mode 100644 index faed851214f3a13d5fd25c093a6b44b2fa3ea6c0..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/cytosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('C')+entity.propertyValue('SEQUENCE').count('c') \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/gc.py b/plasmid/source/core-plugins/petermigration/1/compatibility/gc.py deleted file mode 100644 index 5067337f62e736ee766c3a087f778ea51155b3f0..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/gc.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = (len(re.findall("G|g|C|c", entity.propertyValue('SEQUENCE'))) * 100)/len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/guanosine_count.py b/plasmid/source/core-plugins/petermigration/1/compatibility/guanosine_count.py deleted file mode 100644 index 913b9db58cc74a5804779a4b2d9dcddd5ab12290..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/guanosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('G')+entity.propertyValue('SEQUENCE').count('g') \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/length.py b/plasmid/source/core-plugins/petermigration/1/compatibility/length.py deleted file mode 100644 index 13aedef6fbb96d8392fad958d3defcbd371b539b..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/length.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/nucleotide_count.py b/plasmid/source/core-plugins/petermigration/1/compatibility/nucleotide_count.py deleted file mode 100644 index e7630820e04b82ee92614b9951711a6343a8ec58..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/nucleotide_count.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = len(re.findall("R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/thymidine_count.py b/plasmid/source/core-plugins/petermigration/1/compatibility/thymidine_count.py deleted file mode 100644 index 9d9db9385a916e533b74363d60f9b2acefecb8aa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/thymidine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('T')+entity.propertyValue('SEQUENCE').count('t') \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/compatibility/tm.py b/plasmid/source/core-plugins/petermigration/1/compatibility/tm.py deleted file mode 100644 index a841d384a3226c09d47d7e72cccd7cb8aa52cc56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/compatibility/tm.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result =68.3+ (0.41* float(len(re.findall("G|g|C|c", entity.propertyValue('SEQUENCE'))) * 100)/float(len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))))) -(600/float(len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitions.py b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitions.py deleted file mode 120000 index d16e42850d35ea24a66064d8b534deebedc04f56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitions.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitions.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitionsVoc.py b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitionsVoc.py deleted file mode 120000 index 1883a7061938c66144390382f1839653b6ca37fa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/definitionsVoc.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitionsVoc.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/doc/fm11_odbc_jdbc_guide_en.pdf b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/doc/fm11_odbc_jdbc_guide_en.pdf deleted file mode 100644 index 36aaa0f12220dbde26b7ece4e3b78914087893b0..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/doc/fm11_odbc_jdbc_guide_en.pdf and /dev/null differ diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/FileMakerMain.java deleted file mode 100644 index a2206338c1ccb79267396fbe2751fbb529304ab8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/FileMakerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - - -// STEP By Step: -// 1. Open the file maker file with file maker pro -// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on -// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" -// Without closing file maker pro you can run this script, modify it as needed -// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf - -public class FileMakerMain -{ - // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this - public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; - public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; - - static class Document { - String fileName; - String info; - String serial; - - public String toString() - { - return fileName + " " + info; - } - } - - public static List<Document> getDocuments(Connection connection) throws SQLException { - List<Document> documents = new ArrayList<Document>(); - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); - ResultSet result = preparedStatement.executeQuery(); - - while(result.next()) { - Document document = new Document(); - document.fileName = result.getString("fileName"); - document.info = result.getString("info"); - document.serial = result.getString("serial"); - documents.add(document); - } - result.close(); - preparedStatement.close(); - return documents; - } - - public static byte[] getFile(Connection connection, Document document) throws SQLException { - byte[] bytes = {}; - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); - preparedStatement.setString(1, document.serial); - ResultSet result = preparedStatement.executeQuery(); - if(result.next()) { - byte[] value = result.getBytes("fileData"); - if(value != null) { - bytes = value; - } - } - result.close(); - preparedStatement.close(); - return bytes; - } - - public static void main(String[] args) throws Exception { - Class.forName("com.filemaker.jdbc.Driver").newInstance(); - Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); - - for(Document document: getDocuments(connection)) { - byte[] bytes = getFile(connection, document); - System.out.println(document + " " + bytes.length); - } - connection.close(); - } -} diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc.jar b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc.jar deleted file mode 100644 index 34cae1d60b916205b9039fe765c971229cef1a32..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc12.jar b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc12.jar deleted file mode 100644 index b73e996fe85d7bc2ce5a177d37fe17f46a7f0cbb..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/lib/fmjdbc12.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py deleted file mode 100644 index 5dd5b146358140d2b0281597f87696fe45bd6e13..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/migration.py +++ /dev/null @@ -1,650 +0,0 @@ -# some_file.py -import sys -import definitions -import definitionsVoc -import re -import random -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -import java.lang.Class as Class -import java.sql.DriverManager as DriverManager - -## -## Generic Process Method -## -notMigratedEntities = { - "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} - } - -def addNotMigratedEntity(type, entityID, error): - if type not in notMigratedEntities: - notMigratedEntities[type] = {} - if entityID not in notMigratedEntities[type]: - notMigratedEntities[type][entityID] = {} - if error not in notMigratedEntities[type][entityID]: - notMigratedEntities[type][entityID][error] = 1 - else: - notMigratedEntities[type][entityID][error] += 1 - -def printNotMigratedEntities(): - print "--- Not Migrated Entities Report" - for type in notMigratedEntities: - print "Type: [" + str(type) + "]" - for id in notMigratedEntities[type]: - for error in notMigratedEntities[type][id]: - print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) - print "---" - -def process(tr): - print "START!" - createDataHierarchy(tr) - for adaptor in adaptors: - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" - while adaptor.next(): - entity = adaptor.getEntity() - print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" - try: - if not entity.isInOpenBIS(tr): - entity.write(tr) - #print entity.getIdentifier(tr) + " - Updated" - else: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") - except Exception, error: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) - #print entity.getIdentifier(tr) + " - Already up to date" - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" - print "REPORT START" - printNotMigratedEntities() - definitionsVoc.printCreatedTerms() - print "REPORT FINISH" - print "FINISH!" - -## -## Help Methods -## -def setEntityProperties(tr, definition, entity, properties): - for propertyCode, propertyValue in properties.iteritems(): - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, propertyCode) - if propertyValue is not None: - propertyValue = unicode(propertyValue) - - if propertyDefinition is not None and propertyDefinition[3] == DataType.TIMESTAMP and propertyValue is not None: - date_val = datetime.strptime(propertyValue, "%Y") - propertyValue = datetime.strftime(date_val, "%Y-%m-%d") - - if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue - else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 60: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - -## -## Generic Pattern -## -class EntityAdaptor: - entities = None - entitiesIdx = None - definition = None - - def init(self): - self.entities = [] - self.entitiesIdx = -1 - pass - - def next(self): - if self.entities is None and self.entitiesIdx is None: - self.init() - self.entitiesIdx += 1 - if len(self.entities) > self.entitiesIdx: - return True - else: - return False - - def addEntity(self, values): - self.entities.append(OpenBISDTO(values, self.definition)) - - def getEntity(self): - return self.entities[self.entitiesIdx] - -class OpenBISDTO: - values = {} - definition = None - - def __init__(self, values, definition): - self.values = values - self.definition = definition - - def getIdentifier(self, tr): - pass - - def isInOpenBIS(self, tr): - pass - - def write(self, tr): - pass - -## -## Costumer specific logic: generic part -## -experimentCache = {} -sampleCache = {} -sampleID2Sample = {} - -def getExperimentForUpdate(experimentIdentifier, experimentType, tr): - if experimentIdentifier not in experimentCache: - #print "Cache failed " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.getExperimentForUpdate(experimentIdentifier) - if experiment is None and experimentType is not None: - #print "Cache Create " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.createNewExperiment(experimentIdentifier, experimentType) - if experiment is not None: - experimentCache[experimentIdentifier] = experiment - else: - pass - #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) - if experimentIdentifier not in experimentCache: - return None - else: - return experimentCache[experimentIdentifier] - -def getSampleForUpdate(sampleIdentifier, sampleType, tr): - if sampleIdentifier not in sampleCache: - #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) - sample = tr.getSampleForUpdate(sampleIdentifier) - if sample is None and sampleType is not None: - #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) - if sampleType == "ANTIBODY": - experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/ANTIBODIES", sampleType, tr) - elif sampleType == "CELL": - experiment = getExperimentForUpdate("/MATERIALS/CELL_LINES/CELL_LINE_COLLECTION_1", sampleType, tr) - elif sampleType == "STRAIN": - experiment = getExperimentForUpdate("/MATERIALS/YEASTS/YEAST_COLLECTION", sampleType, tr) - elif sampleType == "PLASMID": - experiment = getExperimentForUpdate("/MATERIALS/PLASMIDS/PLASMID_COLLECTION_1", sampleType, tr) - elif sampleType == "CHEMICAL": - experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/CHEMICALS", sampleType, tr) - elif sampleType == "SIRNA": - experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/RNA_COLLECTION_1", sampleType, tr) - elif sampleType == "OLIGO": - experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1", sampleType, tr) - sample = tr.createNewSample(sampleIdentifier, sampleType) - sample.setExperiment(experiment) - if sample is not None: - sampleCache[sampleIdentifier] = sample - else: - pass - #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) - - if sampleIdentifier not in sampleCache: - return None - else: - return sampleCache[sampleIdentifier] - -class FileMakerEntityAdaptor(EntityAdaptor): - connection = None - selectQuery = None - - def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): - Class.forName("com.filemaker.jdbc.Driver").newInstance() - self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) - - def init(self): - EntityAdaptor.init(self) - - preparedStatement = self.connection.prepareStatement(self.selectQuery) - result = preparedStatement.executeQuery() - - while result.next(): - values = {} - for property in self.definition: - values[property[0]] = result.getString(property[2]) - self.addEntity(values) - result.close() - preparedStatement.close() - -## -## Customer specific logic: different sample types -## -class FMPeterOpenBISDTO(OpenBISDTO): - def isSampleCacheable(self): - return True - - def isInOpenBIS(self, tr): - code = self.getIdentifier(tr) - if (code is not None) and (' ' not in code): - if self.isSampleCacheable(): - sampleID2Sample[self.values["NAME"]] = self.values - sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) - if sample is not None: - lastModificationData = self.values["MODIFICATION_DATE"].strip() - lastModificationData = str(datetime.strptime(lastModificationData, "%Y-%m-%d"))[:10] - lastModificationOpenBIS = sample.getPropertyValue("MODIFICATION_DATE")[:10] - return lastModificationOpenBIS == lastModificationData - else : - return False - else: - print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" - raise Exception('Invalid Code found ' + str(code)) - -class FMPeterBoxAdaptor(FileMakerEntityAdaptor): - selectBoxQuery = None - entityIdFieldName = None - entityCodeFieldName = None - - def addEntity(self, values): - self.entities.append(FMPeterEntityBoxOpenBISDTO(values, self.definition)) - - def init(self): - #print "Reading boxes for: " + self.__class__.__name__ - emptyBox = 0 - boxes = {} - EntityAdaptor.init(self) - preparedStatement = self.connection.prepareStatement(self.selectBoxQuery) - result = preparedStatement.executeQuery() - while result.next(): - entityId = unicode(result.getString(self.entityIdFieldName)) - if entityId is not None: - if entityId in sampleID2Sample: - antibodyNumber = sampleID2Sample[entityId][self.entityCodeFieldName] - if antibodyNumber is not None: - values = {} - values["STORAGE_NAME"] = result.getString("location") - values["STORAGE_ROW"] = "1" - values["STORAGE_COLUMN"] = "1" - values["STORAGE_BOX_NAME"] = result.getString("box label") - values["STORAGE_BOX_SIZE"] = result.getString("box size") - values["STORAGE_USER"] = result.getString("owner") - values["STORAGE_BOX_POSITION"] = result.getString("position") - - allBoxes = [] - if antibodyNumber in boxes: - allBoxes = boxes[antibodyNumber] - else: - boxes[antibodyNumber] = allBoxes - allBoxes.append(values) - else: - #The antibody is not there. What the *#%$& - emptyBox += 1 - else: - #The antibody is not there. What the *#%$& - emptyBox += 1 - - print "- ERROR ADAPTOR Boxes positions with empty entityId for " + self.__class__.__name__ + ":" + str(emptyBox) - - for entiyCode, allBoxes in boxes.iteritems(): - self.addEntity({ - "*CODE" : entiyCode, - "*BOXESLIST" : allBoxes - }) - - result.close() - preparedStatement.close() - -class FMPeterEntityBoxOpenBISDTO(OpenBISDTO): - def getIdentifier(self, tr): - return self.values["*CODE"] - - def write(self, tr): - sample = getSampleForUpdate("/MATERIALS/"+self.values["*CODE"], None, tr) - print "* INFO Boxes size: " + str(len(self.values["*BOXESLIST"])) - #Delete old boxes - for boxNum in range(1, definitions.numberOfStorageGroups+1): - for propertyCode in definitions.getStorageGroupPropertyCodes(): - sample.setPropertyValue(propertyCode + "_" + str(boxNum), None) - - #Add new boxes - boxNum = 0 - for box in self.values["*BOXESLIST"]: - boxNum += 1 - for propertyCode, propertyValue in box.iteritems(): - if propertyCode == "STORAGE_NAME": - freezerName = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("FREEZER", propertyValue) - if freezerName is None: - #print repr("NOT FOUND FEEZER: " + self.values["ANTIBODY_ID_NR"] + " : '" + unicode(propertyValue) + "'") - propertyValue = None - else: - propertyValue = freezerName - - if propertyValue is not None: - propertyValue = unicode(propertyValue) - sample.setPropertyValue(propertyCode + "_" + str(boxNum), propertyValue) - - def isBoxPressent(self, boxSignature, tr): - sample = getSampleForUpdate("/MATERIALS/"+self.values["*CODE"], None, tr) - if sample is not None: - for boxNum in range(1, definitions.numberOfStorageGroups+1): - storedSignature = ""; - for propertyCode in definitions.getStorageGroupPropertyCodes(): - propertyValue = sample.getPropertyValue(propertyCode + "_" + str(boxNum)) - if propertyValue is not None: - propertyValue = unicode(propertyValue) - storedSignature += propertyValue - if storedSignature == boxSignature: - #print "Found Box " + storedSignature.encode('ascii', 'ignore') - return True - return False - - def isInOpenBIS(self, tr): - for box in self.values["*BOXESLIST"]: - boxSignature = ""; - for propertyCode in definitions.getStorageGroupPropertyCodes(): - propertyValue = box[propertyCode] - if propertyCode == "STORAGE_NAME": - propertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("FREEZER", propertyValue) - if propertyCode == "STORAGE_USER": - propertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("LAB_MEMBERS_INITIALS", propertyValue) - - if propertyValue is not None: - propertyValue = unicode(propertyValue) - boxSignature += propertyValue - if not self.isBoxPressent(boxSignature, tr): - return False - return True -## -## Antibodies -## -class AntibodyAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"boxit antibodies\"" - self.definition = definitions.antibodyDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(AntibodyOpenBISDTO(values, self.definition)) - -class AntibodyOpenBISDTO(FMPeterOpenBISDTO): - def write(self, tr): - sample = getSampleForUpdate("/MATERIALS/"+self.values["ANTIBODY_ID_NR"],"ANTIBODY", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - return self.values["ANTIBODY_ID_NR"] - -class AntibodyBoxAdaptor(FMPeterBoxAdaptor): - selectBoxQuery = "SELECT * FROM \"antibody boxes\"" - entityIdFieldName = "antibody ID" - entityCodeFieldName = "ANTIBODY_ID_NR" - -## -## Cells -## -class CellAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"boxit cells\"" - self.definition = definitions.cellDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(CellOpenBISDTO(values, self.definition)) - -class CellOpenBISDTO(FMPeterOpenBISDTO): - def write(self, tr): - code = self.values["CELL_ID_NR_COPY"] - if code is not None and code.startswith("c_"): - sample = getSampleForUpdate("/MATERIALS/"+code,"CELL", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = self.values["CELL_ID_NR_COPY"] - return code - -class CellBoxAdaptor(FMPeterBoxAdaptor): - selectBoxQuery = "SELECT * FROM \"cell boxes\"" - entityIdFieldName = "cell ID" - entityCodeFieldName = "CELL_ID_NR_COPY" - -## -## Strains -## -class StrainAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"boxit strains\"" - self.definition = definitions.strainDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(StrainOpenBISDTO(values, self.definition)) - -class StrainOpenBISDTO(FMPeterOpenBISDTO): - def write(self, tr): - code = self.values["STRAIN_ID_NR"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"STRAIN", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = self.values["STRAIN_ID_NR"] - return code - -class StrainBoxAdaptor(FMPeterBoxAdaptor): - selectBoxQuery = "SELECT * FROM \"strain boxes\"" - entityIdFieldName = "strain ID" - entityCodeFieldName = "STRAIN_ID_NR" -## -## Plasmids -## -class PlasmidAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"boxit plasmids\"" - self.definition = definitions.plasmidDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(PlasmidOpenBISDTO(values, self.definition)) - -class PlasmidOpenBISDTO(FMPeterOpenBISDTO): - def write(self, tr): - code = self.values["PLASMID_ID_NR"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"PLASMID", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = self.values["PLASMID_ID_NR"] - return code - -class PlasmidBoxAdaptor(FMPeterBoxAdaptor): - selectBoxQuery = "SELECT * FROM \"plasmid boxes\"" - entityIdFieldName = "plasmid ID" - entityCodeFieldName = "PLASMID_ID_NR" - -## -## Oligos -## -class OligoAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"boxit oligos\"" - self.definition = definitions.oligoDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(OligoOpenBISDTO(values, self.definition)) - -class OligoOpenBISDTO(FMPeterOpenBISDTO): - def write(self, tr): - code = self.values["OLIGO_ID_NR"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = self.values["OLIGO_ID_NR"] - return code - -class OligoBoxAdaptor(FMPeterBoxAdaptor): - selectBoxQuery = "SELECT * FROM \"oligo boxes\"" - entityIdFieldName = "oligo ID" - entityCodeFieldName = "OLIGO_ID_NR" - -## -## Chemical -## -class ChemicalAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"Chemicals\"" - self.definition = definitions.chemicalDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(ChemicalOpenBISDTO(values, self.definition)) - -class ChemicalOpenBISDTO(FMPeterOpenBISDTO): - def isSampleCacheable(self): - return False - - def write(self, tr): - code = "CHEM_" + self.values["RECORD_NUMBER"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"CHEMICAL", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = "CHEM_" + self.values["RECORD_NUMBER"] - return code - -## -## Sirna -## -class SirnaAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"siRNA\"" - self.definition = definitions.siRNADefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(SirnaOpenBISDTO(values, self.definition)) - -class SirnaOpenBISDTO(FMPeterOpenBISDTO): - def isSampleCacheable(self): - return False - - def write(self, tr): - code = "SI_" + self.values["SIRNA_OLIGONUMBER"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"SIRNA", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - code = "SI_" +self.values["SIRNA_OLIGONUMBER"] - return code - -## -## Documents -## -class DocumentsAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT CAST(file AS VARCHAR(1000)) AS file, info, id_nr, serial, \"date created\", \"date modified\" FROM documents" - self.definition = definitions.documentDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - preparedStatement = self.connection.prepareStatement("SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"); - preparedStatement.setString(1, values["SERIAL"]); - result = preparedStatement.executeQuery(); - - if result.next(): - fileData = result.getBytes("fileData"); - values["*DATA"] = fileData - - self.entities.append(DocumentOpenBISDTO(values, self.definition)) - -class DocumentOpenBISDTO(OpenBISDTO): - def write(self, tr): - sampleIdentifier = "/MATERIALS/"+self.values["ID_NR"]; - dataSetSample = getSampleForUpdate(sampleIdentifier, None, tr) - if dataSetSample is not None and self.values["*DATA"] is not None and self.values["FILE"] is not None: - print "* INFO DATASET CREATION FOR SERIAL " + self.values["SERIAL"] + " WITH FILE " + self.values["FILE"] - dataSet = tr.createNewDataSet("DOCUMENT") - dataSet.setSample(dataSetSample) - setEntityProperties(tr, self.definition, dataSet, self.values) - absolutePath = tr.createNewFile(dataSet, self.values["FILE"].replace("/", "_")) - f = open(absolutePath, 'wb') - f.write(self.values["*DATA"]) - f.close() - #incoming = tr.getIncoming() - #tr.moveFile(incoming.getAbsolutePath(), dataSet) - else: - if dataSetSample is None: - print "* ERROR No sample found for document" - raise Exception('No sample found for document') - if self.values["*DATA"] is None: - print "* ERROR No Data found for file" - raise Exception('No Data found for file') - if self.values["FILE"] is None: - print "* ERROR No file name found for file" - raise Exception('No file name found for file') - - def getIdentifier(self, tr): - return self.values["SERIAL"] - - def getDocumentBySerial(self, tr, serial): - criteria = SearchCriteria() - criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) - criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.TYPE, "DOCUMENT")) - criteria.addMatchClause(criteria.MatchClause.createPropertyMatch("SERIAL", serial)) - datasets = tr.getSearchService().searchForDataSets(criteria) - if datasets: - return datasets[0] - else: - return None - - def isInOpenBIS(self, tr): - dataset = self.getDocumentBySerial(tr, self.values["SERIAL"]) - return dataset is not None - -#fmConnString = "jdbc:filemaker://127.0.0.1/" -fmConnString = "jdbc:filemaker://fm.ethz.ch/" -fmUser= "designer" -fmPass = "seattle" - -adaptors = [ - AntibodyAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibodies_Peter"), - AntibodyBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibody_boxes_Peter"), - PlasmidAdaptor(fmConnString, fmUser, fmPass, "BOXIT_plasmids_Peter"), - PlasmidBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_plasmid_boxes_Peter"), - StrainAdaptor(fmConnString, fmUser, fmPass, "BOXIT_strains_Peter"), - StrainBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_strain_boxes_Peter"), - OligoAdaptor(fmConnString, fmUser, fmPass, "BOXIT_oligos_Peter"), - OligoBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_oligo_boxes_Peter"), - CellAdaptor(fmConnString, fmUser, fmPass, "BOXIT_cells_Peter"), - CellBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_cell_boxes_Peter"), - SirnaAdaptor(fmConnString, fmUser, fmPass, "BOXIT_Main_Menu_Peter"), - ChemicalAdaptor(fmConnString, fmUser, fmPass, "BOXIT_Main_Menu_Peter"), - DocumentsAdaptor(fmConnString, fmUser, fmPass, "BOXIT_documents_Peter") - ] - - - -def createDataHierarchy(tr): - inventorySpace = tr.getSpace("MATERIALS") - if inventorySpace == None: - tr.createNewSpace("MATERIALS", None) - tr.createNewProject("/MATERIALS/REAGENTS") - tr.createNewProject("/MATERIALS/CELL_LINES") - tr.createNewProject("/MATERIALS/POLYNUCLEOTIDES") - tr.createNewProject("/MATERIALS/PLASMIDS") - tr.createNewProject("/MATERIALS/YEASTS") - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/plugin.properties b/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/plugin.properties deleted file mode 100644 index 54f2044ddda7bb67c827931911974a3ed40540c7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/1/dss/drop-boxes/petermigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = petermigration -incoming-dir = ${root-dir}/petermigration \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/as/definitions.py b/plasmid/source/core-plugins/petermigration/2/as/definitions.py deleted file mode 120000 index 9d9f64edb4d7ca720007f93151f62aa62c34c41a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/2/as/definitions.py +++ /dev/null @@ -1 +0,0 @@ -../../1/as/definitions.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py b/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py deleted file mode 120000 index 57641c7dbd61cc574c3d3049bca32465429ce449..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py +++ /dev/null @@ -1 +0,0 @@ -../../1/as/definitionsVoc.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py b/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py deleted file mode 100644 index 8483198d714690357e60ba5d59c7ed43805d2678..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py +++ /dev/null @@ -1,175 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.createNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - -def createDataSetTypeWithProperties(dataSetCode, description, properties): - newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); - newDataSet.setDescription(description); - addProperties(newDataSet, properties); - -def createExperimentTypeWithProperties(experimentTypeCode, description, properties): - newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); - newExperiment.setDescription(description); - addProperties(newExperiment, properties); - -def getSampleType(sampleTypeCode): - sampleType = None - if sampleTypeCode in samplesCache: - sampleType = samplesCache[sampleTypeCode]; - else: - sampleType = tr.getSampleType(sampleTypeCode) - samplesCache[sampleTypeCode] = sampleType; - return sampleType; - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = getSampleType(sampleTypeCodes); - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - addProperty(entity, property[0], property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8], None); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory, position): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); - propertyAssignment.setSection(section); - propertyAssignment.setMandatory(isMandatory); - if position is not None: - propertyAssignment.setPositionInForms(position); - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setShownEdit(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(True); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -def addStorageGroups(numGroups, sampleType): - for storageIdx in range(1,(numGroups + 1)): - storageGroup = definitions.getStorageGroupDefinition(); - for property in storageGroup: - property[0] = property[0] + "_" + str(storageIdx); - property[1] = property[1] + "_" + str(storageIdx); - property[5] = property[5] + "_" + str(storageIdx); - addPropertiesToSamples([sampleType], storageGroup); - -def findAssignment(entityType, propertyType): - for assignment in tr.listPropertyAssignments(): - if assignment.getEntityKind().equals(entityType.getEntityKind()) and assignment.getEntityTypeCode() == entityType.getCode() and assignment.getPropertyTypeCode() == propertyType.getCode(): - return assignment; - return None; - -def addBoxSizeProperty(numGroups, sampleTypeCode): - sampleType = getSampleType(sampleTypeCode) - for storageIdx in range(1,(numGroups + 1)): - property = ["STORAGE_BOX_SIZE", "Physical Storage", "box size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box size", None, None, False]; - property[0] = property[0] + "_" + str(storageIdx); - property[1] = property[1] + "_" + str(storageIdx); - property[5] = property[5] + "_" + str(storageIdx); - #Resolve Position - position = None - propertyTypeCode = "STORAGE_USER" + "_" + str(storageIdx); - propertyType = tr.getPropertyType(propertyTypeCode); - assigments = tr.listPropertyAssignments(); - assigment = findAssignment(sampleType, propertyType); - if storageIdx == 1: - position = assigment.getPositionInForms(); - else: - position = assigment.getPositionInForms() + storageIdx - 1; - addProperty(sampleType, property[0], property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8], position); - -#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION -def createScript(path, name, description, scriptType, entityType): - scriptAsString = open(path, 'r').read(); - script = tr.getOrCreateNewScript(name); - script.setName(name); - script.setDescription(description); - script.setScript(scriptAsString); - script.setScriptType(scriptType); - script.setEntityForScript(entityType); - return script; - -## -## Vocabulary Types -## -createVocabularyWithTerms("STORAGE_BOX_SIZE", definitionsVoc.vocabularyDefinitions["STORAGE_BOX_SIZE"]); - -## -## New Position Property -## -addBoxSizeProperty(definitions.numberOfStorageGroups, "ANTIBODY"); -addBoxSizeProperty(definitions.numberOfStorageGroups, "CELL"); -addBoxSizeProperty(definitions.numberOfStorageGroups, "STRAIN"); -addBoxSizeProperty(definitions.numberOfStorageGroups, "PLASMID"); -addBoxSizeProperty(definitions.numberOfStorageGroups, "OLIGO"); diff --git a/plasmid/source/core-plugins/petermigration/2/dss b/plasmid/source/core-plugins/petermigration/2/dss deleted file mode 120000 index e38b42b024e1e893dd85763357df04d9fafce358..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/2/dss +++ /dev/null @@ -1 +0,0 @@ -../1/dss/ \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/NOTES b/plasmid/source/core-plugins/petermigration/NOTES deleted file mode 100644 index 702e3af4b6d71d472330616c346d8f3781feac75..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/petermigration/NOTES +++ /dev/null @@ -1,64 +0,0 @@ -Migration Steps, for a second migration, fixing everyhing missed during the first -1. Backup DB -2. Delete problematic properties BOX_SIZE_PROPERTY and STORAGE_BOX_SIZE_1 as Orphan metadata, created by error -3. Delete problematic vocabulary STORAGE_BOX_POSITIONS as Orphan metadata, created by error -4. Update Database user id property used by the ELN storage from vocabulary to varchar - --- This should return no rows, meaning this property is empty and no values need to be fixed -SELECT * -FROM sample_properties sp LEFT JOIN sample_type_property_types stpt ON (sp.stpt_id = stpt.id) -WHERE stpt_id IN (SELECT id -FROM sample_type_property_types -WHERE prty_id IN -(SELECT id -FROM property_types -WHERE daty_id = 7 AND covo_id = 12 AND code LIKE 'STORAGE_USER_%')); - --- If no rows we can update to varchar -UPDATE property_types -SET covo_id = NULL, daty_id = 1 -WHERE daty_id = 7 AND covo_id = 12 AND code LIKE 'STORAGE_USER_%'; - -5. Run Script - -6. Weird things to Fix, labels without numbers or with underscores - -- Storage groups have an underscore on the display name - -UPDATE sample_type_property_types -SET section = 'Physical Storage ' || substring(section from (char_length('Physical Storage_')+1) for 2) -WHERE section LIKE 'Physical Storage_%'; - -- Storage properties labels have an underscore on the label name - -UPDATE property_types -SET description = 'Storage Name ' || substring(code from (char_length('STORAGE_NAME_')+1) for 2), label = 'Location ' || substring(code from (char_length('STORAGE_NAME_')+1) for 2) -WHERE code LIKE 'STORAGE_NAME_%'; - -UPDATE property_types -SET description = 'Storage Row ' || substring(code from (char_length('STORAGE_ROW_')+1) for 2), label = 'Storage Row ' || substring(code from (char_length('STORAGE_ROW_')+1) for 2) -WHERE code LIKE 'STORAGE_ROW_%'; - -UPDATE property_types -SET description = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2), label = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2) -WHERE code LIKE 'STORAGE_COLUMN_%'; - -UPDATE property_types -SET description = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2), label = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2) -WHERE code LIKE 'STORAGE_COLUMN_%'; - -UPDATE property_types -SET description = 'Storage Box Name ' || substring(code from (char_length('STORAGE_BOX_NAME_')+1) for 2), label = 'Box Label ' || substring(code from (char_length('STORAGE_BOX_NAME_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_NAME_%'; - -UPDATE property_types -SET description = 'Storage User Id ' || substring(code from (char_length('STORAGE_USER_')+1) for 2), label = 'Frozen By ' || substring(code from (char_length('STORAGE_USER_')+1) for 2) -WHERE code LIKE 'STORAGE_USER_%'; - -UPDATE property_types -SET description = 'Storage Box Size ' || substring(code from (char_length('STORAGE_BOX_SIZE_')+1) for 2), label = 'Box Size ' || substring(code from (char_length('STORAGE_BOX_SIZE_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_SIZE_%'; - -UPDATE property_types -SET description = 'Storage Box Position ' || substring(code from (char_length('STORAGE_BOX_POSITION_')+1) for 2), label = 'Box Position ' || substring(code from (char_length('STORAGE_BOX_POSITION_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_POSITION_%'; \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/as/definitions.py b/plasmid/source/core-plugins/schroedermigration/1/as/definitions.py deleted file mode 100644 index 48448f8e64acd283cc5ed5059bb21aa2b45fefda..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/as/definitions.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - - -# -# Sample Types -# - -# Columns -# propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory, showInEditViews - -CELL_LINE = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], -# ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_SEARCH", "General", "cell ID search", DataType.VARCHAR, None, "", None, None, False], -# ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.VARCHAR, None, "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False, False], - ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["MEDIUM_FOR_CELL", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False, False], - ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], -# ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], - ["PUBLICATION", "General", "reference", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], -# ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SPECIES_FOR_CELL", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], - ["TUBES", "General", "tubes", DataType.INTEGER, None, "", None, None, False], - ["COMMENTS", "General", "info", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["XMLCOMMENTS", "Comments", "Comments List", DataType.XML, None, "Several comments can be added by different users", "COMMENTS_SAMPLE", None, False, False], - ["ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", "ANNOTATIONS_CELL_LINE", None, False, False] -]; - -STORAGE_POSITION = [ - ["STORAGE_CODE", "Physical Storage", "Storage Code", DataType.VARCHAR, None, "Storage Code", None, None, False, False], - ["STORAGE_RACK_ROW", "Physical Storage", "Storage Rack Row", DataType.INTEGER, None, "Storage Rack Row", None, None, False, False], - ["STORAGE_RACK_COLUMN", "Physical Storage", "Storage Rack Column", DataType.INTEGER, None, "Storage Rack Column", None, None, False, False], - ["STORAGE_BOX_NAME", "Physical Storage", "Storage Box Name", DataType.VARCHAR, None, "Storage Box Name", None, None, False, False], - ["STORAGE_BOX_SIZE", "Physical Storage", "Storage Box Size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box Size", None, None, False, False], - ["STORAGE_BOX_POSITION", "Physical Storage", "Storage Box Position", DataType.VARCHAR, None, "Storage Box Position", None, None, False, False], - ["STORAGE_USER", "Physical Storage", "Storage User Id", DataType.VARCHAR, None, "Storage User Id", None, None, False, False], - ["COMMENTS", "General", "info", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], - ["CLONE_", "General", "clone#", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["XMLCOMMENTS", "Comments", "Comments List", DataType.XML, None, "Several comments can be added by different users", "COMMENTS_SAMPLE", None, False, False], - ["ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", "ANNOTATIONS_STORAGE_POSITION", None, False, False], - # Maybe used during the migration, but it goes away, is never copied over - ["*LOCATION", "General", "location", DataType.VARCHAR, None, "", None, None, False, False], - ["*BOX_NAME", "General", "box label", DataType.VARCHAR, None, "", None, None, False, False], - ["*DRAWER", "General", "drawer", DataType.VARCHAR, None, "", None, None, False, False], - ["*BOX_SIZE", "General", "box size", DataType.VARCHAR, None, "", None, None, False, False], - ["*OWNER", "General", "owner", DataType.VARCHAR, None, "", None, None, False, False], - ["*POSITION", "General", "position", DataType.VARCHAR, None, "", None, None, False, False], - ["*CELL_ID", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False, False], - ["*INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False, False], - ["*FROZEN_BY", "General", "frozen by", DataType.VARCHAR, None, "", None, None, False, False], -# ["*COLOUR", "General", "colour", DataType.VARCHAR, None, "", None, None, False], -# ["*COLOUR_A1", "General", "colour A1", DataType.VARCHAR, None, "", None, None, False], -# ["*COLOUR_REST", "General", "colour rest", DataType.VARCHAR, None, "", None, None, False], -# ["*COLOUR_BOX_NR", "General", "colour box nr", DataType.VARCHAR, None, "", None, None, False], - # Read only - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False, False], - ["BOX_NR", "General", "box nr.", DataType.INTEGER, None, "", None, None, False, False], - ["CREATION_DATE", "General", "creation date", DataType.VARCHAR, None, "", None, None, False, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False, False], - ["MODIFIED_BY", "General", "modified by", DataType.VARCHAR, None, "", None, None, False, False], - ["BOX_LABEL_VARIABLE", "General", "box label variable", DataType.VARCHAR, None, "", None, None, False, False], - ["OWNER_VARIABLE", "General", "owner variable", DataType.VARCHAR, None, "", None, None, False, False] -]; diff --git a/plasmid/source/core-plugins/schroedermigration/1/as/definitionsVoc.py b/plasmid/source/core-plugins/schroedermigration/1/as/definitionsVoc.py deleted file mode 100644 index 590955b0e3826ff2f000dbaaf7e545b3ac496c03..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/as/definitionsVoc.py +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "LAB_MEMBERS" : [ - ["Timm_Schroeder","Timm Schroeder"], - ["Hanna_Eilken","Hanna Eilken"], - ["Masae_Sato","Masae Sato"], - ["Thomas_Magg","Thomas Magg"], - ["Andrea_Hermann","Andrea Hermann"], - ["Heike_Partenheimer","Heike Partenheimer"], - ["ISF-H","ISF-H"], - ["Angelika_Roth","Angelika Roth"], - ["Inge_Baas","Inge Baas"], - ["Erin_Drew","Erin Drew"], - ["Ingo_Burtscher_Hanna_Eilken","Ingo Burtscher/Hanna Eilken"], - ["Matthias_Munding","Matthias Munding"], - ["Michael_Rieger","Michael Rieger"], - ["Masaki_Shigeta","Masaki Shigeta"], - ["Annemieke_IJpenberg","Annemieke IJpenberg"], - ["Max_Endele","Max Endele"], - ["Philipp_Hoppe","Philipp Hoppe"], - ["Adam_Filipczyk","Adam Filipczyk"], - ["Simon_Hastreiter","Simon Hastreiter"], - ["Joost_van_den_Berg","Joost van den Berg"], - ["Konstantinos_Kokkaliaris","Konstantinos Kokkaliaris"], - ["Konstantinos","Konstantinos"], - ["Nadine_Moritz","Nadine Moritz"], - ["Christian_Raithel","Christian Raithel"], - ["Martin_Etzrodt","Martin Etzrodt"], - ["Andreas_Reimann","Andreas Reimann"], - ["Paul_Bourgine","Paul Bourgine"], - ["Laura_Skylaki","Laura Skylaki"], - ["Ren_Shimamoto","Ren Shimamoto"], - ["Weijia_Wang","Weijia Wang"], - ["RS","RS"] - ], - - "SELECTION" : [ - ["NEOMYCIN_G418", "Neomycin/G418"], - ["PUROMYCIN", "Puromycin"], - ["HYGROMYCIN", "Hygromycin"], - ["BLASTICIDIN", "Blasticidin"], - ["UNKNOWN", "?"], - ["FACS", "FACS"] - ], - "CO2" : [ - ["5", "5"], - ["7.5", "7.5"] - ], - "GROWTH_TEMPERATURE" : [ - ["37", "37"], - ["32", "32"], - ["28", "28"], - ["33", "33"] - ], - "MEDIUM" : [ - ["UNKNOWN","?"], - ["alphaMEM","alphaMEM"], - ["aMEM","aMEM"], - ["aMEM_FGF2","aMEM + FGF2"], - ["aMEM_CM_FGF2","aMEM CM + FGF2"], - ["DMEM","DMEM"], - ["DMEM_high_glucose","DMEM (high glucose)"], - ["DMEM_high_Glucose_LGlutamin_Pyruvate","DMEM high Glucose + L-Glutamin + Pyruvate"], - ["DMEM_IMDM_or","DMEM or IMDM or .... (not critical)"], - ["DMSO_FBS","DMSO + FBS"], - ["EB5_maintanance_medium","EB5 mainanance medium"], - ["EB5_maintanance_medium","EB5 maintanance medium"], - ["EB5_maintanance","EB5 maintanance"], - ["EB5_maintanance","EB5 maintanence"], - ["ES_cell_medium","ES cell medium"], - ["ES_cell_medium_FCS11_LIF","ES cell medium (FCS11, LIF)"], - ["ES_cell_medium_FSC11_LIF","ES cell medium (FSC11, LIF)"], - ["Glasgow_Minimum_Gibco","Glasgow Minimum (Gibco)"], - ["Glasgow_Minimum_Gibco","Glasgow Minimum Gibco"], - ["Glasgow_Minimum_Gibco","Glasgow Minimun Gibco"], - ["high_glucose_DMEM","high glucose DMEM"], - ["high_glucose_DMEM","high-glucose DMEM"], - ["IMDM_10DMSO","IMDM / 10% DMSO"], - ["IMDM_310-320mosm_kg","IMDM 310-320mosm/kg"], - ["Knock-In_Gibco","Knock-In Gibco"], - ["Knock-out_Medium_Gibco","Knock-out Medium (Gibco)"], - ["Knock-Out_DMEM","Knock-Out DMEM"], - ["maintenance_medium","maintenance medium"], - ["MEGM_Mammary_Epithelial_BulletKit","MEGM Mammary Epithelial BulletKit"], - ["RPMI_1640","RPMI 1640"], - ["RPMI_wo_Phenol_Red","RPMI w/o Phenol Red"], - ["SFEM","SFEM"], - ["SL_2i_Or_N2B27_2i","SL+2i or N2B27+2i"], - ["without_gelatine_and_feeder_knockout_DMEM_15FCS","without gelatine and feeder, knockout DMEM, 15% FCS, 2mM Gln, NEAA, LIF, PenStrep, 1,5x10-4 MTG"], - ], - "CELL_OBTAINED_FROM" : [ - ["Elaine_Spooncer","Elaine Spooncer"], - ["Ursula_Just","Ursula Just"], - ["Ralf_Mozikat_GSF_Munich","Ralf Mozikat, GSF, Munich"], - ["Kuroda_K","Kuroda K"], - ["Hueltner_GSF","Hueltner? GSF?"], - ["ShinIchi_Nishikawa","ShinIchi Nishikawa"], - ["Mulligan_R","Mulligan R"], - ["Milner_L","Milner L"], - ["Kempkes_B","Kempkes B"], - ["Kempkes_B_Weinmaster_G","Kempkes B, Weinmaster G"], - ["Honjo_T","Honjo T"], - ["Nolan","Nolan"], - ["Ursula_Just_Hamburg","Ursula Just, ? Hamburg"], - ["Honjo_Tasuku","Honjo Tasuku"], - ["Dan_Tenen","Dan Tenen"], - ["Fumio_Matsuzaki","Fumio Matsuzaki"], - ["Sakurai_Era","Sakurai / Era"], - ["Igor_Samochvalov","Igor Samochvalov"], - ["Hitoshi_Niwa","Hitoshi Niwa"], - ["Sakurai_in_Kobe","Sakurai in Kobe"], - ["Minetaro_Ogawa_Kumamoto_University","Minetaro Ogawa, Kumamoto University"], - ["Gerald_de_Haan","Gerald de Haan"], - ["Carmen_Ebel_AVM","Carmen Ebel AVM"], - ["Eric_Bouhassira","Eric Bouhassira"], - ["Masui","Masui"], - ["Heikos_group","Heikos group"], - ["Kateri_Moore","Kateri Moore"], - ["Ralf_Kuhn","Ralf Kühn"], - ["Ralph_Kuhn","Ralph Kühn"], - ["Inge_Baas","Inge Baas"], - ["AG_Ruhland","AG Ruhland"], - ["Igor_Samokhvalov","Igor Samokhvalov"], - ["p11_stock_AH","p11 stock (AH)"], - ["Aileen_Smith","Aileen Smith"], - ["Hans_Scholer","Hans Schöler"], - ["Dietrich_Lesinski","Dietrich Lesinski"], - ["Ian_Chambers","Ian Chambers"], - ["Lemischka","Lemischka"], - ["EUCOMM","EUCOMM"], - ["Andrea_Beyerle_ILBD","Andrea Beyerle (ILBD)"], - ["Konstantinos_Anastassiadis","Konstantinos Anastassiadis"], - ["Adam_Filipczyk","Adam Filipczyk"], - ["Hideo_Yagita","Hideo Yagita"], - ["Robert_Oostendorp","Robert Oostendorp"], - ["Thomas_Graf","Thomas Graf"], - ["Andrew_Elefanty_Ed_Stanley","Andrew Elefanty & Ed Stanley"], - ["Clontech","Clontech"], - ["Adam_Filipczyk_Konstantinos_Anastassiadis","Adam Filipczyk, Konstantinos Anastassiadis"], - ["Klinikum_Rechts_der_Isar","Klinikum Rechts der Isar"], - ["ATCC","ATCC"], - ["Daisuke_Sugiyama","Daisuke Sugiyama"], - ["Alessio_Zippo","Alessio Zippo"], - ["Vyas_Paresh_Oxford","Vyas Paresh, Oxford"], - ["Ivan_Martin","Ivan Martin"], - ["Paul_Bourgine","Paul Bourgine"], - ["AR","AR"], - ["Gadue_Paul","Gadue, Paul"], - ["Antonius_Rolink","Antonius Rolink"], - ["Eszter_Posfai_Janet_Rossant","Eszter Posfai/Janet Rossant"], - ["Cell_Biolabs_inc.","Cell Biolabs, inc."], - ["Simon_Hastreiter","Simon Hastreiter"], - ["CiRA","CiRA"], - ["Gibco","Gibco"], - ["PrimCell","PrimCell"], - ["E_Friman","E. Friman"], - ["CiRA_Yamada_lab","CiRA, Yamada lab"] - ], - "CELL_SPECIES" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["MOUSE_MAYBE", "mouse ?"] - ], - "CONC_UNITS" : [ - ["MICROG_MICROL", "�g/�l"], - ["MG_ML", "mgl/ml"], - ["UG_ML", "ug/ml"] - ], - "STORAGE_BOX_SIZE" : [ - ["10X10", "10x10"] - ], - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/as/initialize-master-data.py b/plasmid/source/core-plugins/schroedermigration/1/as/initialize-master-data.py deleted file mode 100644 index 606c1f41f3e35907dd7e22d82b0793a33105e28f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/as/initialize-master-data.py +++ /dev/null @@ -1,132 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.getOrCreateNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - - - -def getSampleType(sampleTypeCode): - sampleType = None - if sampleTypeCode in samplesCache: - sampleType = samplesCache[sampleTypeCode]; - else: - sampleType = tr.getSampleType(sampleTypeCode) - samplesCache[sampleTypeCode] = sampleType; - return sampleType; - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = getSampleType(sampleTypeCode); - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - if not property[0].startswith("*"): - showInEditViews = None; - if len(property) > 9 and property[9] is not None: - showInEditViews = property[9]; - addProperty(entity, property[0], property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8], showInEditViews); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory, showInEditViews): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); #If the assignment already exists, returns the existing one - propertyAssignment.setSection(section); - propertyAssignment.setShownEdit(True); - propertyAssignment.setMandatory(isMandatory); - - if showInEditViews is not None: - propertyAssignment.setShownEdit(showInEditViews); - - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(False); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -def findAssignment(entityType, propertyType): - for assignment in tr.listPropertyAssignments(): - if assignment.getEntityKind().equals(entityType.getEntityKind()) and assignment.getEntityTypeCode() == entityType.getCode() and assignment.getPropertyTypeCode() == propertyType.getCode(): - return assignment; - return None; - -## -## Vocabulary Types -## -for vocabularyCode, vocabularyValues in definitionsVoc.vocabularyDefinitions.iteritems(): - createVocabularyWithTerms(vocabularyCode, vocabularyValues) - -## -## Sample Types -## -createSampleTypeWithProperties("CELL_LINE", "", definitions.CELL_LINE); -createSampleTypeWithProperties("STORAGE_POSITION", "", definitions.STORAGE_POSITION); \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitions.py b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitions.py deleted file mode 120000 index d16e42850d35ea24a66064d8b534deebedc04f56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitions.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitions.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitionsVoc.py b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitionsVoc.py deleted file mode 120000 index 1883a7061938c66144390382f1839653b6ca37fa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/definitionsVoc.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitionsVoc.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/doc/fm11_odbc_jdbc_guide_en.pdf b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/doc/fm11_odbc_jdbc_guide_en.pdf deleted file mode 100644 index 36aaa0f12220dbde26b7ece4e3b78914087893b0..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/doc/fm11_odbc_jdbc_guide_en.pdf and /dev/null differ diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/FileMakerMain.java deleted file mode 100644 index a2206338c1ccb79267396fbe2751fbb529304ab8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/FileMakerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - - -// STEP By Step: -// 1. Open the file maker file with file maker pro -// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on -// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" -// Without closing file maker pro you can run this script, modify it as needed -// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf - -public class FileMakerMain -{ - // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this - public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; - public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; - - static class Document { - String fileName; - String info; - String serial; - - public String toString() - { - return fileName + " " + info; - } - } - - public static List<Document> getDocuments(Connection connection) throws SQLException { - List<Document> documents = new ArrayList<Document>(); - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); - ResultSet result = preparedStatement.executeQuery(); - - while(result.next()) { - Document document = new Document(); - document.fileName = result.getString("fileName"); - document.info = result.getString("info"); - document.serial = result.getString("serial"); - documents.add(document); - } - result.close(); - preparedStatement.close(); - return documents; - } - - public static byte[] getFile(Connection connection, Document document) throws SQLException { - byte[] bytes = {}; - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); - preparedStatement.setString(1, document.serial); - ResultSet result = preparedStatement.executeQuery(); - if(result.next()) { - byte[] value = result.getBytes("fileData"); - if(value != null) { - bytes = value; - } - } - result.close(); - preparedStatement.close(); - return bytes; - } - - public static void main(String[] args) throws Exception { - Class.forName("com.filemaker.jdbc.Driver").newInstance(); - Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); - - for(Document document: getDocuments(connection)) { - byte[] bytes = getFile(connection, document); - System.out.println(document + " " + bytes.length); - } - connection.close(); - } -} diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/fmjdbc12.jar b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/fmjdbc12.jar deleted file mode 100644 index b73e996fe85d7bc2ce5a177d37fe17f46a7f0cbb..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/lib/fmjdbc12.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/migration.py b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/migration.py deleted file mode 100644 index 1a09d70b691f70bd28291e8a91d150a9bea4e85f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/migration.py +++ /dev/null @@ -1,435 +0,0 @@ -# some_file.py -import sys -import definitions -import definitionsVoc -import re -import random -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType -import uuid - -import java.lang.Class as Class -import java.sql.DriverManager as DriverManager - -## -## Generic Process Method -## -notMigratedEntities = { - "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} - } - -def addNotMigratedEntity(type, entityID, error): - if type not in notMigratedEntities: - notMigratedEntities[type] = {} - if entityID not in notMigratedEntities[type]: - notMigratedEntities[type][entityID] = {} - if error not in notMigratedEntities[type][entityID]: - notMigratedEntities[type][entityID][error] = 1 - else: - notMigratedEntities[type][entityID][error] += 1 - -def printNotMigratedEntities(): - print "--- Not Migrated Entities Report" - for type in notMigratedEntities: - print "Type: [" + str(type) + "]" - for id in notMigratedEntities[type]: - for error in notMigratedEntities[type][id]: - print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) - print "---" - -def process(tr): - print "START!" - createDataHierarchy(tr) - for adaptor in adaptors: - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" - while adaptor.next(): - entity = adaptor.getEntity() - print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" -# try: - if not entity.isInOpenBIS(tr): - entity.write(tr) - #print entity.getIdentifier(tr) + " - Updated" - else: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") -# except Exception, error: -# addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) - #print entity.getIdentifier(tr) + " - Already up to date" - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" - # Set Parents - for sampleName in sampleID2Sample: - sample = sampleID2Sample[sampleName] - sampleParentName = sample.getPropertyValue("PARENTAL_CELL") - if sampleParentName != None and sampleParentName != "": - if sampleParentName in sampleID2Sample: - sampleParent = sampleID2Sample[sampleParentName] - if sample is not sampleParent: - sample.setParentSampleIdentifiers([sampleParent.getSampleIdentifier()]); - else: - print "Sample depends on itself ===> '" + str(sampleParentName) + "'" - else: - print "Missing sample parent ===> '" + sampleName + "' depends on '" + str(sampleParentName) + "'" - # - print "REPORT START" - printNotMigratedEntities() - definitionsVoc.printCreatedTerms() - print "INVESTIGATORS MISSING" - global investigatorsMissing - print str(investigatorsMissing) - print "REPORT FINISH" - print "FINISH!" - -def hasColumn(rs, columnName): - rsmd = rs.getMetaData() - columns = rsmd.getColumnCount() - for x in range(1, columns + 1): - foundColumnName = rsmd.getColumnName(x); - if columnName == foundColumnName: - return True - return False - -## -## Help Methods -## -def setEntityProperties(tr, definition, entity, properties): - for propertyCode, propertyValue in properties.iteritems(): - #print "CODE ---->" + propertyCode - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, propertyCode) - #print "DEF ---->" + str(propertyDefinition) - - if (propertyValue is not None) and (propertyDefinition is not None) and ((propertyDefinition[3] == DataType.INTEGER) or (propertyDefinition[3] == DataType.REAL)): - propertyValue = propertyValue.strip(' ') - - if (propertyValue is not None) and (propertyDefinition is not None) and ((propertyDefinition[3] == DataType.VARCHAR) or (propertyDefinition[3] == DataType.MULTILINE_VARCHAR)): - propertyValue = unicode(propertyValue) - - if (propertyValue is not None) and (propertyDefinition is not None) and (propertyDefinition[3] == DataType.TIMESTAMP): - date_val = datetime.strptime(propertyValue, "%Y-%m-%d") - propertyValue = datetime.strftime(date_val, "%Y-%m-%d") - - if (propertyValue is not None) and (propertyDefinition is not None) and (propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY): - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue - else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 60: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - if (propertyDefinition is not None) and (not propertyCode.startswith("*")): #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - -## -## Generic Pattern -## -class EntityAdaptor: - entities = None - entitiesIdx = None - definition = None - - def init(self): - self.entities = [] - self.entitiesIdx = -1 - pass - - def next(self): - if self.entities is None and self.entitiesIdx is None: - self.init() - self.entitiesIdx += 1 - if len(self.entities) > self.entitiesIdx: - return True - else: - return False - - def addEntity(self, values): - self.entities.append(OpenBISDTO(values, self.definition)) - - def getEntity(self): - return self.entities[self.entitiesIdx] - -class OpenBISDTO: - values = {} - definition = None - - def __init__(self, values, definition): - self.values = values - self.definition = definition - - def getIdentifier(self, tr): - pass - - def isInOpenBIS(self, tr): - pass - - def write(self, tr): - pass - -## -## Costumer specific logic: generic part -## -experimentCache = {} -sampleCache = {} -sampleID2Sample = {} -globalSequences = {}; - -def getNextGlobalSequence(id): - currentSequence = None; - - if id in globalSequences: - currentSequence = globalSequences[id]; #Get existing sequence - else: - currentSequence = 0; # Create a new one - - #Advance and store new step on the sequence - currentSequence = currentSequence+1; - globalSequences[id] = currentSequence; - - #Return the new sequence number - return str(currentSequence); - -def getExperimentForUpdate(experimentIdentifier, experimentType, tr): - if experimentIdentifier not in experimentCache: - #print "Cache failed " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.getExperimentForUpdate(experimentIdentifier) - if experiment is None and experimentType is not None: - #print "Cache Create " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.createNewExperiment(experimentIdentifier, experimentType) - if experiment is not None: - experimentCache[experimentIdentifier] = experiment - else: - pass - #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) - if experimentIdentifier not in experimentCache: - return None - else: - return experimentCache[experimentIdentifier] - -def getSampleForUpdate(sampleIdentifier, sampleType, tr): - if sampleIdentifier not in sampleCache: - #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) - sample = None #tr.getSampleForUpdate(sampleIdentifier) - if sample is None and sampleType is not None: - #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) - experiment = None - if sampleType == "CELL_LINE": - experiment = getExperimentForUpdate("/MATERIALS/CELL_LINES/CELL_LINE_COLLECTION_1", "MATERIALS", tr) - sample = tr.createNewSample(sampleIdentifier, sampleType) - if experiment is not None: - sample.setExperiment(experiment) - if sample is not None: - sampleCache[sampleIdentifier] = sample - else: - pass - #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) - - if sampleIdentifier not in sampleCache: - return None - else: - return sampleCache[sampleIdentifier] - -class FileMakerEntityAdaptor(EntityAdaptor): - connection = None - selectQuery = None - columnPrefix = None - - def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): - Class.forName("com.filemaker.jdbc.Driver").newInstance() - self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) - - def init(self): - EntityAdaptor.init(self) - - preparedStatement = self.connection.prepareStatement(self.selectQuery) - result = preparedStatement.executeQuery() - - while result.next(): - values = {} - for property in self.definition: - propertyCode = property[0] - columnName = property[2] - if self.columnPrefix != None: - columnName = self.columnPrefix + columnName - if hasColumn(result, columnName): - propertyValue = result.getString(columnName) - if propertyValue != None: - propertyValue = propertyValue.strip("\r") - values[propertyCode] = propertyValue - print str(values); - self.addEntity(values) - result.close() - preparedStatement.close() - -## -## Customer specific logic: different sample types -## -class FMSchroederOpenBISDTO(OpenBISDTO): - def isInOpenBIS(self, tr): - code = self.getIdentifier(tr) - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) - if sample is not None: - lastModificationData = self.values["MODIFICATION_DATE"].strip() - lastModificationData = str(datetime.strptime(lastModificationData, "%Y-%m-%d"))[:10] - lastModificationOpenBIS = sample.getPropertyValue("MODIFICATION_DATE")[:10] - return lastModificationOpenBIS == lastModificationData - else : - return False - else: - print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" - raise Exception('Invalid Code found ' + str(code)) - -## -## Cells -## -class CellAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"cells\"" - self.definition = definitions.CELL_LINE - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(CellOpenBISDTO(values, self.definition)) - -class CellOpenBISDTO(FMSchroederOpenBISDTO): - def write(self, tr): - code = self.values["*CODE"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"CELL_LINE", tr) - setEntityProperties(tr, self.definition, sample, self.values); - global sampleID2Sample - sampleID2Sample[self.values["NAME"]] = sample - - def getIdentifier(self, tr): - if "*CODE" not in self.values: - self.values["*CODE"] = "CELL_LINE_" + getNextGlobalSequence("CELL_LINE"); - return self.values["*CODE"]; - -class CellBoxPositionAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"cell boxes\"" - self.definition = definitions.STORAGE_POSITION - self.columnPrefix = "cell ID data box:" - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(CellBoxPositionOpenBISDTO(values, self.definition)) - - -racks = { - u"N2" : "N2", - u"-140°C R5.38" : "MINUS140_R5.38" - } - -investigators = { - u"Timm_Schroeder" : "timmsc", - u"Martin_Etzrodt" : "etzromar", - u"Simon_Hastreiter" : "hassimon", - u"Laura_Skylaki" : "skylakis", - u"Dirk_Löffler" : "ldirk", - u"Konstantinos_Kokkaliaris" : "kokkalik", - u"Oliver_Hilsenbeck" : "hilsenbo", - u"Philip_Dettinger" : "philipd", - u"Andreas_Reimann" : "anreiman", - u"Leo_Kunz" : "kunzl", - u"Nouraiz_Ahmed" : "noahmed", - u"Ren_Shimamoto" : "rens", - u"Weijia_Wang" : "wwang", - u"Geethika_Arekatla" : "garekatl", - u"Tobias_Kull" : "tkull", - u"Arne_Wehling" : "awehling", - u"Yang_Zhang" : "yangzhan", - u"Jeffrey_Bernitz" : "jbernitz" - } - -investigatorsMissing = {} -class CellBoxPositionOpenBISDTO(FMSchroederOpenBISDTO): - def write(self, tr): - code = self.values["*CODE"] - if code is not None: - sample = getSampleForUpdate("/STORAGE/"+code,"STORAGE_POSITION", tr) - sampleParent = sampleID2Sample[self.values["*CELL_ID"]]; - - setEntityProperties(tr, self.definition, sample, self.values); - drawer = self.values["*DRAWER"]; - row = None - column = None - if (drawer is not None) and (len(drawer) > 0) and ("/" in drawer): - row = drawer.split("/")[0]; - column = drawer.split("/")[1]; - - if self.values["*LOCATION"] == u"-140°C R5.38" and row == None and column == None: - row = "1" - column = "1" - - if self.values["*LOCATION"] != None: - sample.setPropertyValue("STORAGE_CODE", racks[self.values["*LOCATION"]]) - - if row != None: - sample.setPropertyValue("STORAGE_RACK_ROW", row.strip(" ")) # syntax is y/x: x is the row - if column != None: - sample.setPropertyValue("STORAGE_RACK_COLUMN", column.strip(" ")) # syntax is y/x: y is the tower, i.e. the column - sample.setPropertyValue("STORAGE_BOX_NAME", self.values["*BOX_NAME"]) - sample.setPropertyValue("STORAGE_BOX_SIZE", self.values["*BOX_SIZE"]) - sample.setPropertyValue("STORAGE_BOX_POSITION", self.values["*POSITION"]) - - boxOwner = None - if sampleParent.getPropertyValue("INVESTIGATOR") != None and sampleParent.getPropertyValue("INVESTIGATOR") not in investigators: - global investigatorsMissing - investigatorsMissing[sampleParent.getPropertyValue("INVESTIGATOR")] = True - if sampleParent.getPropertyValue("INVESTIGATOR") in investigators: - boxOwner = investigators[sampleParent.getPropertyValue("INVESTIGATOR")] - elif self.values["*FROZEN_BY"] != None: - boxOwner = self.values["*FROZEN_BY"] - else: - boxOwner = self.values["*OWNER"] - sample.setPropertyValue("STORAGE_USER", boxOwner) - - # Set parent - sample.setParentSampleIdentifiers([sampleParent.getSampleIdentifier()]); - - def getIdentifier(self, tr): - if "*CODE" not in self.values: - self.values["*CODE"] = str(uuid.uuid4()); - return self.values["*CODE"]; - -fmConnString = "jdbc:filemaker://127.0.0.1/" -#fmConnString = "jdbc:filemaker://fm.ethz.ch/" -fmUser= "Admin" -fmPass = "" - -adaptors = [ - CellAdaptor(fmConnString, fmUser, fmPass, "boxit-cells"), - CellBoxPositionAdaptor(fmConnString, fmUser, fmPass, "boxit-cell-boxes") - ] - -def createDataHierarchy(tr): - storageCollection = getExperimentForUpdate("/ELN_SETTINGS/STORAGES/STORAGES_COLLECTION", "COLLECTION", tr) - storageN2 = getSampleForUpdate("/ELN_SETTINGS/N2","STORAGE", tr) - storageN2.setExperiment(storageCollection) - storageN2.setPropertyValue("NAME", "N2") - storageN2.setPropertyValue("ROW_NUM", "10") - storageN2.setPropertyValue("COLUMN_NUM", "10") - storageN2.setPropertyValue("BOX_NUM", "9999") - storageN2.setPropertyValue("STORAGE_SPACE_WARNING", "80") - storageN2.setPropertyValue("BOX_SPACE_WARNING", "80") - storageN2.setPropertyValue("STORAGE_VALIDATION_LEVEL", "BOX_POSITION") - storage180 = getSampleForUpdate("/ELN_SETTINGS/MINUS140_R5.38","STORAGE", tr) - storage180.setExperiment(storageCollection) - storage180.setPropertyValue("NAME", "-140°C R5.38") - storage180.setPropertyValue("ROW_NUM", "1") - storage180.setPropertyValue("COLUMN_NUM", "1") - storage180.setPropertyValue("BOX_NUM", "9999") - storage180.setPropertyValue("STORAGE_SPACE_WARNING", "80") - storage180.setPropertyValue("BOX_SPACE_WARNING", "80") - storage180.setPropertyValue("STORAGE_VALIDATION_LEVEL", "BOX_POSITION") - - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/plugin.properties b/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/plugin.properties deleted file mode 100644 index 1f7e51e23868b27eb985380f1305d2d7a2482f60..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/1/dss/drop-boxes/schroedermigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = schroedermigration -incoming-dir = ${root-dir}/schroedermigration \ No newline at end of file diff --git a/plasmid/source/core-plugins/schroedermigration/NOTES b/plasmid/source/core-plugins/schroedermigration/NOTES deleted file mode 100644 index 702e3af4b6d71d472330616c346d8f3781feac75..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/schroedermigration/NOTES +++ /dev/null @@ -1,64 +0,0 @@ -Migration Steps, for a second migration, fixing everyhing missed during the first -1. Backup DB -2. Delete problematic properties BOX_SIZE_PROPERTY and STORAGE_BOX_SIZE_1 as Orphan metadata, created by error -3. Delete problematic vocabulary STORAGE_BOX_POSITIONS as Orphan metadata, created by error -4. Update Database user id property used by the ELN storage from vocabulary to varchar - --- This should return no rows, meaning this property is empty and no values need to be fixed -SELECT * -FROM sample_properties sp LEFT JOIN sample_type_property_types stpt ON (sp.stpt_id = stpt.id) -WHERE stpt_id IN (SELECT id -FROM sample_type_property_types -WHERE prty_id IN -(SELECT id -FROM property_types -WHERE daty_id = 7 AND covo_id = 12 AND code LIKE 'STORAGE_USER_%')); - --- If no rows we can update to varchar -UPDATE property_types -SET covo_id = NULL, daty_id = 1 -WHERE daty_id = 7 AND covo_id = 12 AND code LIKE 'STORAGE_USER_%'; - -5. Run Script - -6. Weird things to Fix, labels without numbers or with underscores - -- Storage groups have an underscore on the display name - -UPDATE sample_type_property_types -SET section = 'Physical Storage ' || substring(section from (char_length('Physical Storage_')+1) for 2) -WHERE section LIKE 'Physical Storage_%'; - -- Storage properties labels have an underscore on the label name - -UPDATE property_types -SET description = 'Storage Name ' || substring(code from (char_length('STORAGE_NAME_')+1) for 2), label = 'Location ' || substring(code from (char_length('STORAGE_NAME_')+1) for 2) -WHERE code LIKE 'STORAGE_NAME_%'; - -UPDATE property_types -SET description = 'Storage Row ' || substring(code from (char_length('STORAGE_ROW_')+1) for 2), label = 'Storage Row ' || substring(code from (char_length('STORAGE_ROW_')+1) for 2) -WHERE code LIKE 'STORAGE_ROW_%'; - -UPDATE property_types -SET description = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2), label = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2) -WHERE code LIKE 'STORAGE_COLUMN_%'; - -UPDATE property_types -SET description = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2), label = 'Storage Column ' || substring(code from (char_length('STORAGE_COLUMN_')+1) for 2) -WHERE code LIKE 'STORAGE_COLUMN_%'; - -UPDATE property_types -SET description = 'Storage Box Name ' || substring(code from (char_length('STORAGE_BOX_NAME_')+1) for 2), label = 'Box Label ' || substring(code from (char_length('STORAGE_BOX_NAME_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_NAME_%'; - -UPDATE property_types -SET description = 'Storage User Id ' || substring(code from (char_length('STORAGE_USER_')+1) for 2), label = 'Frozen By ' || substring(code from (char_length('STORAGE_USER_')+1) for 2) -WHERE code LIKE 'STORAGE_USER_%'; - -UPDATE property_types -SET description = 'Storage Box Size ' || substring(code from (char_length('STORAGE_BOX_SIZE_')+1) for 2), label = 'Box Size ' || substring(code from (char_length('STORAGE_BOX_SIZE_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_SIZE_%'; - -UPDATE property_types -SET description = 'Storage Box Position ' || substring(code from (char_length('STORAGE_BOX_POSITION_')+1) for 2), label = 'Box Position ' || substring(code from (char_length('STORAGE_BOX_POSITION_')+1) for 2) -WHERE code LIKE 'STORAGE_BOX_POSITION_%'; \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/antibodies_script.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/antibodies_script.py deleted file mode 100644 index 68c92964d38677d279b4182eec13c4ed7343cf66..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/antibodies_script.py +++ /dev/null @@ -1,234 +0,0 @@ -""" -Managed Property Script for handling General Antibodies. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_QUANTITY = "quantity" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -QUANTITY_LABEL = "quantity" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(antibodies_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - antibodyPath= "/YEAST_LAB/" + antibodies_list - permId =entityInformationProvider().getSamplePermId(SPACE, antibodies_list) - if not permId: - permId = antibodies_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, antibodies_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - antibodies_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if antibodies_list: - sampleLink = _createSampleLink(antibodies_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for antibody in elements: - antibodies_list = antibody.getAttribute(ATR_CODE, "") - name = antibody.getAttribute(ATR_NAME,"") - quantity_list=antibody.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, antibody, antibodies_list) - row.setCell(CODE_LABEL, antibodies_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new antibody, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new antibody relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRAB')\ - .setDescription('Code of antibody, e.g. "FRAB1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected antibody relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of antibody sample, e.g. "FRAB1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected antibody relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new antibody element with values from input fields - and add it to existing elements. - """ - antibodies_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(antibodies_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the antibody element corresponding to selected row - and replace it with an element with values from input fields. - """ - antibodies_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - sampleLink = _createSampleLink(antibodies_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete antibodies that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -#def updateFromBatchInput(bindings): -# elements = [] -# input = bindings.get('') -# if input is not None: -# commentEntry = _createCommentEntry(input) -# elements.append(commentEntry) -# property.value = propertyConverter().convertToString(elements) - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - antibodies = input.split(',') - for antibody in antibodies: - (code, quantity) = _extractCodeAndQuantity(antibody) - commentEntry = _createCommentEntry(input) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink, commentEntry) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(antibody): - codeAndQuantity = chemical.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/bacteria_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/bacteria_links.py deleted file mode 100644 index 48d750b6ebfdc3e053fef6a2ac3491fdfcede0cd..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/bacteria_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(bacterias_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bacteriaPath= "/YLAB-TEST/" + bacterias_list - permId =entityInformationProvider().getSamplePermId(SPACE, bacterias_list) - if not permId: - permId = bacterias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, bacterias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - bacterias_list = item.get('CODE') - comment_list = item.get('COMMENT') - if bacterias_list: - sampleLink = _createSampleLink(bacterias_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for bacteria in elements: - bacterias_list = bacteria.getAttribute(ATR_CODE, "") - name = bacteria.getAttribute(ATR_NAME,"") - comment_list=bacteria.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, bacteria, bacterias_list) - row.setCell(CODE_LABEL, bacterias_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new bacteria, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new bacteria relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRB')\ - .setDescription('Code of bacteria, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected bacteria relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of bacteria sample, e.g. "FRB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected bacteria relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new bacteria element with values from input fields - and add it to existing elements. - """ - bacterias_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(bacterias_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the bacteria element corresponding to selected row - and replace it with an element with values from input fields. - """ - bacterias_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(bacterias_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete bacterias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - bacterias = input.split(',') - for bacteria in bacterias: - (code, comment) = _extractCodeAndComment(bacteria) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(bacteria): - codeAndComment = bacteria.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_links.py deleted file mode 100644 index f68bd11e74af942b30c770153e9f1aa6abd63cc6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - chemicals_list = item.get('CODE') - concentration_list = item.get('CONCENTRATION') - if chemicals_list: - sampleLink = _createSampleLink(chemicals_list, concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - concentration_list=chemical.getAttribute(ATR_CONC, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, concentration) = _extractCodeAndConcentration(chemical) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(chemical): - codeAndConcentration = chemical.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_quantity_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_quantity_links.py deleted file mode 100644 index ee60933815a236ab51923fe244e67bf82f83e9ae..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/chemicals_quantity_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling CHEMICALS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(chemicals_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =entityInformationProvider().getSamplePermId(SPACE, chemicals_list) - if not permId: - permId = chemicals_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - chemicals_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if chemicals_list: - sampleLink = _createSampleLink(chemicals_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for chemical in elements: - chemicals_list = chemical.getAttribute(ATR_CODE, "") - name = chemical.getAttribute(ATR_NAME,"") - quantity_list=chemical.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, chemical, chemicals_list) - row.setCell(CODE_LABEL, chemicals_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new chemical, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new chemical relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of chemical, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected chemical relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of chemical sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the chemical sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected chemical relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new chemical element with values from input fields - and add it to existing elements. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(chemicals_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the chemical element corresponding to selected row - and replace it with an element with values from input fields. - """ - chemicals_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(chemicals_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete chemicals that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - chemicals = input.split(',') - for chemical in chemicals: - (code, quantity) = _extractCodeAndQuantity(chemical) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(chemical): - codeAndQuantity = chemical.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/enzymes_link.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/enzymes_link.py deleted file mode 100644 index 281f61aa76f92dd5c0904d0c42be305bb853db29..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/enzymes_link.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling ENZYMES. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONCENTRATION = "concentration" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONCENTRATION_LABEL = "concentration" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(enzymes_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - enzymePath= "/YEAST_LAB/" + enzymes_list - permId =entityInformationProvider().getSamplePermId(SPACE, enzymes_list) - if not permId: - permId = enzymes_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, enzymes_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONCENTRATION, concentration_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONCENTRATION_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - enzymes_list = item.get('CODE') - concentration_list = item.get('CONCENTRATION') - if enzymes_list: - sampleLink = _createSampleLink(enzymes_list, concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONCENTRATION_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for enzyme in elements: - enzymes_list = enzyme.getAttribute(ATR_CODE, "") - name = enzyme.getAttribute(ATR_NAME,"") - concentration_list=enzyme.getAttribute(ATR_CONCENTRATION, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, enzyme, enzymes_list) - row.setCell(CODE_LABEL, enzymes_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONCENTRATION_LABEL, concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new enzyme, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new enzyme relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of enzyme, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONCENTRATION_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected enzyme relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of enzyme sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONCENTRATION_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the enzyme sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONCENTRATION_LABEL, CONCENTRATION_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected enzyme relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new enzyme element with values from input fields - and add it to existing elements. - """ - enzymes_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONCENTRATION_LABEL) - sampleLink = _createSampleLink(enzymes_list, concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the enzyme element corresponding to selected row - and replace it with an element with values from input fields. - """ - enzymes_list = action.getInputValue(CODE_LABEL) - concentration_list = action.getInputValue(CONCENTRATION_LABEL) - - - - sampleLink = _createSampleLink(enzymes_list, concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete enzymes that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - enzymes = input.split(',') - for enzyme in enzymes: - (code, concentration) = _extractCodeAndConcentration(enzyme) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(enzyme): - codeAndConcentration = enzyme.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_annotation.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_annotation.py deleted file mode 100644 index 3625b9e3dcb618d93be558ff7b13ec62cfa41440..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_annotation.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Managed Property Script for links to samples with concentration, quantity, details - - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_DETAIL = "detail" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" -DETAIL_LABEL = "details" - - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(entities_list, quantity_list, detail_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - entityPath= "/YEAST_LAB/" + entities_list - permId =entityInformationProvider().getSamplePermId(SPACE, entities_list) - if not permId: - permId = entities_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, entities_list) - sampleLink.addAttribute(ATR_NAME, name) - if not quantity_list: - quantity_list = ' ' - if not detail_list: - detail_list=' ' - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - sampleLink.addAttribute(ATR_DETAIL, detail_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL, DETAIL_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - entities_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - detail_list = item.get('DETAIL') - if entities_list: - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(DETAIL_LABEL) - - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for entity in elements: - entities_list = entity.getAttribute(ATR_CODE, "") - name = entity.getAttribute(ATR_NAME,"") - quantity_list=entity.getAttribute(ATR_QUANTITY, "") - detail_list=entity.getAttribute(ATR_DETAIL, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, entity, entities_list) - row.setCell(CODE_LABEL, entities_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - row.setCell(DETAIL_LABEL, detail_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new entity, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new entity relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FR')\ - .setDescription('Code of entity, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(False)\ - .setDescription('Quantity'), - inputWidgetFactory().createMultilineTextInputField(DETAIL_LABEL)\ - .setMandatory(False)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected entity relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of entity sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(False)\ - .setDescription('Quantity of the entity sample, e.g. "1M"'), - inputWidgetFactory().createMultilineTextInputField(DETAIL_LABEL)\ - .setMandatory(False)\ - .setDescription('Comment') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - editAction.addBinding(DETAIL_LABEL, DETAIL_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected entity relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new entity element with values from input fields - and add it to existing elements. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - detail_list = action.getInputValue(DETAIL_LABEL) - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the entity element corresponding to selected row - and replace it with an element with values from input fields. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - detail_list = action.getInputValue(DETAIL_LABEL) - - - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete entities that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - entities = input.split(',') - for entity in entities: - (code, quantity, detail) = _extractCodeAndQuantity(entity) -# sampleLink = _createSampleLink(code, quantity, concentration) - sampleLink = _createSampleLink(entities_list, quantity_list, detail_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(entity): - codeAndQuantity = entity.split(':') - if (len(codeAndQuantity) == 3): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip(), codeAndQuantity[2].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_quantity_link_script.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_quantity_link_script.py deleted file mode 100644 index 33fc9d393913581da738e9b2bf318710e3b91775..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/generic_quantity_link_script.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling ENTITIES. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME="name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL="name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(entities_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - entityPath= "/YEAST_LAB/" + entities_list - permId =entityInformationProvider().getSamplePermId(SPACE, entities_list) - if not permId: - permId = entities_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, entities_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - -""" -Example input: - -FRC1:2nM, FRC2, FRC3:3 nM -""" - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - entities_list = item.get('CODE') - quantity_list = item.get('QUANTITY') - if entities_list: - sampleLink = _createSampleLink(entities_list, quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for entity in elements: - entities_list = entity.getAttribute(ATR_CODE, "") - name = entity.getAttribute(ATR_NAME,"") - quantity_list=entity.getAttribute(ATR_QUANTITY, "") - - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, entity, entities_list) - row.setCell(CODE_LABEL, entities_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new entity, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new entity relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FR')\ - .setDescription('Code of entity, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected entity relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of entity sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the entity sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected entity relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new entity element with values from input fields - and add it to existing elements. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(entities_list, quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the entity element corresponding to selected row - and replace it with an element with values from input fields. - """ - entities_list = action.getInputValue(CODE_LABEL) - quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(entities_list, quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete entities that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - entities = input.split(',') - for entity in entities: - (code, quantity) = _extractCodeAndQuantity(entity) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(entity): - codeAndQuantity = entity.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_link.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_link.py deleted file mode 100644 index d28176cfcf22c81b8b677bec662634cd0c57ee27..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_link.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling MEDIA. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(medias_list, media_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - mediaPath= "/YEAST_LAB/" + medias_list - permId =entityInformationProvider().getSamplePermId(SPACE, medias_list) - if not permId: - permId = medias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, media_concentration_list) - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - medias_list = item.get('CODE') - media_concentration_list = item.get('CONCENTRATION') - if medias_list: - sampleLink = _createSampleLink(medias_list, media_concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(CONC_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for media in elements: - medias_list = media.getAttribute(ATR_CODE, "") - name = media.getAttribute(ATR_NAME,"") - media_concentration_list=media.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, media, medias_list) - row.setCell(CODE_LABEL, medias_list) - row.setCell(NAME_LABEL, name) - row.setCell(CONC_LABEL, media_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new media, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new media relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRM')\ - .setDescription('Code of media, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected media relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of media sample, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the media sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected media relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new media element with values from input fields - and add it to existing elements. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the media element corresponding to selected row - and replace it with an element with values from input fields. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(medias_list, media_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete medias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - medias = input.split(',') - for media in medias: - (code, concentration) = _extractCodeAndConcentration(media) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(media): - codeAndConcentration = media.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_quantity_link.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_quantity_link.py deleted file mode 100644 index 37a1b91e1bd4e1a428e34033622fdc17438b36e3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/media_quantity_link.py +++ /dev/null @@ -1,219 +0,0 @@ -""" -Managed Property Script for handling MEDIA. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(medias_list, media_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - mediaPath= "/YEAST_LAB/" + medias_list - permId =entityInformationProvider().getSamplePermId(SPACE, medias_list) - if not permId: - permId = medias_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, media_quantity_list) - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - medias_list = item.get('CODE') - media_quantity_list = item.get('QUANTITY') - if medias_list: - sampleLink = _createSampleLink(medias_list, media_quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for media in elements: - medias_list = media.getAttribute(ATR_CODE, "") - name = media.getAttribute(ATR_NAME,"") - media_quantity_list=media.getAttribute(ATR_QUANTITY, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, media, medias_list) - row.setCell(CODE_LABEL, medias_list) - row.setCell(NAME_LABEL, name) - row.setCell(QUANTITY_LABEL, media_quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new media, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new media relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRM')\ - .setDescription('Code of media, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected media relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of media sample, e.g. "FRM1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the media sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected media relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new media element with values from input fields - and add it to existing elements. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(medias_list, media_quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the media element corresponding to selected row - and replace it with an element with values from input fields. - """ - medias_list = action.getInputValue(CODE_LABEL) - media_quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(medias_list, media_quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete medias that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - medias = input.split(',') - for media in medias: - (code, quantity) = _extractCodeAndQuantity(media) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(media): - codeAndQuantity = media.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/oligo_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/oligo_links.py deleted file mode 100644 index 2da2b83242cebebbd3fa4d9948dfe698a0f64908..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/oligo_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(oligos_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - oligoPath= "/YLAB-TEST/" + oligos_list - permId =entityInformationProvider().getSamplePermId(SPACE, oligos_list) - if not permId: - permId = oligos_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, oligos_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - oligos_list = item.get('CODE') - comment_list = item.get('COMMENT') - if oligos_list: - sampleLink = _createSampleLink(oligos_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for oligo in elements: - oligos_list = oligo.getAttribute(ATR_CODE, "") - name = oligo.getAttribute(ATR_NAME,"") - comment_list=oligo.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, oligo, oligos_list) - row.setCell(CODE_LABEL, oligos_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new oligo, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new oligo relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRO')\ - .setDescription('Code of oligo, e.g. "FRO1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected oligo relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of oligo sample, e.g. "FRO1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected oligo relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new oligo element with values from input fields - and add it to existing elements. - """ - oligos_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(oligos_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the oligo element corresponding to selected row - and replace it with an element with values from input fields. - """ - oligos_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(oligos_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete oligos that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - oligos = input.split(',') - for oligo in oligos: - (code, comment) = _extractCodeAndComment(oligo) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(oligo): - codeAndComment = oligo.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pcr_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pcr_links.py deleted file mode 100644 index c236c1ab02f18aa8016c1d99b40d522c1f4169af..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pcr_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling PCR samples. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(pcrs_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - pcrPath= "/YLAB-TEST/" + pcrs_list - permId =entityInformationProvider().getSamplePermId(SPACE, pcrs_list) - if not permId: - permId = pcrs_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pcrs_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - pcrs_list = item.get('CODE') - comment_list = item.get('COMMENT') - if pcrs_list: - sampleLink = _createSampleLink(pcrs_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for pcr in elements: - pcrs_list = pcr.getAttribute(ATR_CODE, "") - name = pcr.getAttribute(ATR_NAME,"") - comment_list=pcr.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, pcr, pcrs_list) - row.setCell(CODE_LABEL, pcrs_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new pcr, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new pcr relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRPCR')\ - .setDescription('Code of pcr, e.g. "FRPCR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected pcr relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of pcr sample, e.g. "FRPCR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected pcr relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new pcr element with values from input fields - and add it to existing elements. - """ - pcrs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(pcrs_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the pcr element corresponding to selected row - and replace it with an element with values from input fields. - """ - pcrs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(pcrs_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete pcrs that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - pcrs = input.split(',') - for pcr in pcrs: - (code, comment) = _extractCodeAndComment(pcr) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(pcr): - codeAndComment = pcr.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid parents.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid parents.py deleted file mode 100644 index c27d5f1e1e921788d37c3d19c80eb55e0306349a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid parents.py +++ /dev/null @@ -1,368 +0,0 @@ -""" -Managed Property Script for handling PLASMID parents of YEAST samples. - -@author: Piotr Buczek -""" - -import re - - -print "###################" -"""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""input pattern matching one plasmid, e.g.: -- 'FRP1 (DEL:URA3)', -- 'FRP2 (INT)', -- 'FRP3(MOD:URA3)', -- 'FRP4' -""" -INPUT_PATTERN = """ - # no '^': allow whitespace at the beginning - ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') - (\ *\( # start of 2nd group (matches an optional relationship type with annotation) - # any spaces followed by a '(' - ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') - :? # optional ':' separator - (.*) # 4th group: match annotation, any text (e.g. 'URA3') - \))? # end of 2nd (optional) group: closing bracket of relationship details - # no '$': allow whitespace at the end -""" - -""" due to some weird jython threading issue, we need to compile the pattern outside the function body """ -inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) - -"""relationship types shortcuts""" - -DEL_REL_TYPE = 'DEL' -INT_REL_TYPE = 'INT' -MOD_REL_TYPE = 'MOD' - -"""tuple of supported relationship types as shortcuts""" -REL_TYPES = (DEL_REL_TYPE, INT_REL_TYPE, MOD_REL_TYPE) -"""dictionary from relationship type shortcut to its 'character' representation""" -REL_TYPE_CHARS = { - DEL_REL_TYPE: u'\u0394', # unicode '∆' - INT_REL_TYPE: '::', - MOD_REL_TYPE: '_' -} -"""dictionary from relationship type shortcut to its full name/label""" -REL_TYPE_LABELS = { - DEL_REL_TYPE: 'deletion', - INT_REL_TYPE: 'integration', - MOD_REL_TYPE: 'modification' -} - -REL_TYPE_LABEL_OTHER = '(other)' -REL_TYPE_LABELS_WITH_NONE = tuple([REL_TYPE_LABEL_OTHER] + REL_TYPE_LABELS.values()) - -"""names of additional sample XML element attributes""" - -ATR_CODE = "code" -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - -"""labels of table columns""" - -CONNECTION_LABEL = "connection" -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _group(pattern, input): - """@return: groups returned by performing pattern search with given @pattern on given @input""" - return pattern.search(input).groups() - - -def _translateToChar(relationship): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: character representation of given @relationship, - empty string for null - '[<relationship>]' for unknown relationship - """ - if relationship: - if relationship in REL_TYPE_CHARS: - return REL_TYPE_CHARS[relationship] - else: - return "[" + relationship + "]" - else: - return "" - - -def _translateToLabel(relationship): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: full name of given @relationship, - empty string for null, - '[<relationship>]' for unknown relationship - """ - if relationship: - if relationship in REL_TYPE_LABELS: - return REL_TYPE_LABELS[relationship] - else: - return "[" + relationship + "]" - else: - return REL_TYPE_LABEL_OTHER - -def _translateFromLabel(relationshipLabel): - """ - @param relationshipLabel: relationship type as label (@see REL_TYPE_LABELS_WITH_NONE) - @return: type of given @relationshipLabel, None for REL_TYPE_LABEL_OTHER, - """ - if relationshipLabel == REL_TYPE_LABEL_OTHER: - return None - elif relationshipLabel == 'deletion': - return DEL_REL_TYPE - elif relationshipLabel == 'integration': - return INT_REL_TYPE - elif relationshipLabel == 'modification': - return MOD_REL_TYPE - -def _createConnectionString(code, relationship, annotation): - """ - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: string representation of a connection with @relationship translated to a 'character' - """ - result = code - if relationship: - result += _translateToChar(relationship) - if annotation: - result += annotation - return result - - -def _createSampleLink(code, relationship, annotation): - """ - Creates sample link XML element for sample with specified @code. The element will contain - given @code as 'code' attribute apart from standard 'permId' attribute. If specified - @relationship or @annotation are not null they will also be contained as attributes. - - If the sample doesn't exist in DB a fake link will be created with @code as permId. - - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FRP2" permId="20110309154532868-4219" relationship="DEL" annotation="URA3"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - - '<Sample code="FRP4" permId="20110309154532868-4219" relationship="INT"/>' - @raise ValidationException: if the specified relationship type is unknown - """ - permId = entityInformationProvider().getSamplePermId(SPACE, code) - if not permId: - permId = code - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, code) - if relationship: - sampleLink.addAttribute(ATR_RELATIONSHIP, relationship) - if relationship in REL_TYPES: - connectionString = _createConnectionString(code, relationship, annotation) - else: - raise ValidationException("Unknown relationship: '" + relationship + - "'. Expected one of: " + REL_TYPES) - if annotation: - sampleLink.addAttribute(ATR_ANNOTATION, annotation) - return sampleLink - -""" MAIN FUNCTIONS """ - -"""Example input: - -FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 - -Relationship types: -- DEL: deletion -- INT: integration -- MOD: modification -""" - -#def showRawValueInForms(): - # return False - -#def batchColumnNames(): -# return [CODE_LABEL, RELATIONSHIP_LABEL, ANNOTATION_LABEL] - - - - -#def updateFromRegistrationForm(bindings): -# elements = [] -# for item in bindings: -# code = item.get("CODE") -# relationship = item.get("RELATIONSHIP") -# annotation=item.get("ANNOTATION") -# print "code is", code -# if code: -# print "bindings", bindings, "+", code, "+", relationship, "+", annotation - -# sampleLink = _createSampleLink(code, relationship, annotation) - # elements.append(sampleLink) - -# property.value = propertyConverter().convertToString(elements) - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - plasmids = input.split(',') - for p in plasmids: - (code, g, relationship, annotation) = _group(inputPattern, p.strip()) - sampleLink = _createSampleLink(code, relationship, annotation) - elements.append(sampleLink) - - parentsInput = bindings.get(originalColumnNameBindingKey('YEAST_PARENTS')) - if parentsInput is not None: - parents = parentsInput.split(',') - for parent in parents: - permId = entityInformationProvider().getSamplePermId(SPACE, parent.strip()) - parentPlasmids = entityInformationProvider().getSamplePropertyValue(permId, 'PLASMIDS') - if parentPlasmids is None: - continue - parentElements = list(propertyConverter().convertStringToElements(parentPlasmids)) - for parentLink in parentElements: - elements.append(parentLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CONNECTION_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(RELATIONSHIP_LABEL) - tableBuilder.addHeader(ANNOTATION_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plasmid in elements: - code = plasmid.getAttribute(ATR_CODE, "") - relationship = plasmid.getAttribute(ATR_RELATIONSHIP, "") - annotation = plasmid.getAttribute(ATR_ANNOTATION, "") - - row = tableBuilder.addRow() - row.setCell(CONNECTION_LABEL, _createConnectionString(code, relationship, annotation)) - row.setCell(LINK_LABEL, plasmid, code) - row.setCell(CODE_LABEL, code) - row.setCell(RELATIONSHIP_LABEL, _translateToLabel(relationship)) - row.setCell(ANNOTATION_LABEL, annotation) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new plasmid relationship, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plasmid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRP')\ - .setDescription('Code of plasmid sample, e.g. "FRP1"'), - inputWidgetFactory().createComboBoxInputField(RELATIONSHIP_LABEL, REL_TYPE_LABELS_WITH_NONE)\ - .setMandatory(False)\ - .setValue(REL_TYPE_LABEL_OTHER), - inputWidgetFactory().createTextInputField(ANNOTATION_LABEL)\ - .setMandatory(False)\ - .setDescription('Relationship annotation, e.g. "URA3"'), - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected plasmid relationship, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plasmid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of plasmid sample, e.g. "FRP1"'), - inputWidgetFactory().createComboBoxInputField(RELATIONSHIP_LABEL, REL_TYPE_LABELS_WITH_NONE)\ - .setMandatory(False), - inputWidgetFactory().createTextInputField(ANNOTATION_LABEL)\ - .setMandatory(False)\ - .setDescription('Relationship annotation, e.g. "URA3"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(RELATIONSHIP_LABEL, RELATIONSHIP_LABEL) - editAction.addBinding(ANNOTATION_LABEL, ANNOTATION_LABEL) - - """ - 3. delete selected plasmid relationships. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected plasmid relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new plasmid relationship element with values from input fields - and add it to existing elements. - """ - code = action.getInputValue(CODE_LABEL) - relationshipLabel = action.getInputValue(RELATIONSHIP_LABEL) - relationship = _translateFromLabel(relationshipLabel) - annotation = action.getInputValue(ANNOTATION_LABEL) - sampleLink = _createSampleLink(code, relationship, annotation) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the plasmid relationship element corresponding to selected row - and replace it with an element with values from input fields. - """ - code = action.getInputValue(CODE_LABEL) - relationshipLabel = action.getInputValue(RELATIONSHIP_LABEL) - relationship = _translateFromLabel(relationshipLabel) - annotation = action.getInputValue(ANNOTATION_LABEL) - sampleLink = _createSampleLink(code, relationship, annotation) - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the relationships that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid_links.py deleted file mode 100644 index 6ae7be4fe47ea4f8b34e22d9d12afd29245f2264..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/plasmid_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(plamsids_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - plamsidPath= "/YLAB-TEST/" + plamsids_list - permId =entityInformationProvider().getSamplePermId(SPACE, plamsids_list) - if not permId: - permId = plamsids_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, plamsids_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - plamsids_list = item.get('CODE') - comment_list = item.get('COMMENT') - if plamsids_list: - sampleLink = _createSampleLink(plamsids_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plamsid in elements: - plamsids_list = plamsid.getAttribute(ATR_CODE, "") - name = plamsid.getAttribute(ATR_NAME,"") - comment_list=plamsid.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, plamsid, plamsids_list) - row.setCell(CODE_LABEL, plamsids_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new plamsid, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plamsid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRP')\ - .setDescription('Code of plamsid, e.g. "FRP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plamsid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of plamsid sample, e.g. "FRP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected plamsid relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new plamsid element with values from input fields - and add it to existing elements. - """ - plamsids_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(plamsids_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the plamsid element corresponding to selected row - and replace it with an element with values from input fields. - """ - plamsids_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(plamsids_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete plamsids that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - plamsids = input.split(',') - for plamsid in plamsids: - (code, comment) = _extractCodeAndComment(plamsid) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(plamsid): - codeAndComment = plamsid.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe-script.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe-script.py deleted file mode 100644 index b435162ebdb145a6bc17a0c16bb0bba4defcc066..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe-script.py +++ /dev/null @@ -1,186 +0,0 @@ -""" -Managed Property Script for handling links to POMBE samples. - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(pombes_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - pombePath= "/YEAST_LAB/" + pombes_list - permId =entityInformationProvider().getSamplePermId(SPACE, pombes_list) - if not permId: - permId = pombes_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pombes_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - pombes_list = item.get('CODE') - if pombes_list: - sampleLink = _createSampleLink(pombes_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for pombe in elements: - pombes_list = pombe.getAttribute(ATR_CODE, "") - name = pombe.getAttribute(ATR_NAME,"") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, pombe, pombes_list) - row.setCell(CODE_LABEL, pombes_list) - row.setCell(NAME_LABEL, name) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new pombe, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new pombe relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of pombe, e.g. "FRC1"'), - - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected pombe relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of pombe sample, e.g. "FRC1"'), - - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected pombe relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new pombe element with values from input fields - and add it to existing elements. - """ - pombes_list = action.getInputValue(CODE_LABEL) - sampleLink = _createSampleLink(pombes_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the pombe element corresponding to selected row - and replace it with an element with values from input fields. - """ - pombes_list = action.getInputValue(CODE_LABEL) - - sampleLink = _createSampleLink(pombes_list) - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete pombes that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe_links.py deleted file mode 100644 index 91e1baebd09cfed9030716909c0e98a6e6f5fc78..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/pombe_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(pombes_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - pombePath= "/YLAB-TEST/" + pombes_list - permId =entityInformationProvider().getSamplePermId(SPACE, pombes_list) - if not permId: - permId = pombes_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pombes_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - pombes_list = item.get('CODE') - comment_list = item.get('COMMENT') - if pombes_list: - sampleLink = _createSampleLink(pombes_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for pombe in elements: - pombes_list = pombe.getAttribute(ATR_CODE, "") - name = pombe.getAttribute(ATR_NAME,"") - comment_list=pombe.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, pombe, pombes_list) - row.setCell(CODE_LABEL, pombes_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new pombe, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new pombe relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRSP')\ - .setDescription('Code of pombe, e.g. "FRSP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected pombe relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of pombe sample, e.g. "FRSP1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected pombe relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new pombe element with values from input fields - and add it to existing elements. - """ - pombes_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(pombes_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the pombe element corresponding to selected row - and replace it with an element with values from input fields. - """ - pombes_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(pombes_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete pombes that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - pombes = input.split(',') - for pombe in pombes: - (code, comment) = _extractCodeAndComment(pombe) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(pombe): - codeAndComment = pombe.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/protocols_script.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/protocols_script.py deleted file mode 100644 index 201a513197354d87bbbc3540195087d4a71cc6cf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/protocols_script.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling General Protocols. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(protocols_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - protocolPath= "/YLAB-TEST/" + protocols_list - permId =entityInformationProvider().getSamplePermId(SPACE, protocols_list) - if not permId: - permId = protocols_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, protocols_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - protocols_list = item.get('CODE') - comment_list = item.get('COMMENT') - if protocols_list: - sampleLink = _createSampleLink(protocols_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL, 300) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for protocol in elements: - protocols_list = protocol.getAttribute(ATR_CODE, "") - name = protocol.getAttribute(ATR_NAME,"") - comment_list=protocol.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, protocol, protocols_list) - row.setCell(CODE_LABEL, protocols_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new protocol, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new protocol relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRPROT')\ - .setDescription('Code of protocol, e.g. "FRPROT1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected protocol relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of protocol sample, e.g. "FRPROT1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected protocol relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new protocol element with values from input fields - and add it to existing elements. - """ - protocols_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(protocols_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the protocol element corresponding to selected row - and replace it with an element with values from input fields. - """ - protocols_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(protocols_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete protocols that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - protocols = input.split(',') - for protocol in protocols: - (code, comment) = _extractCodeAndComment(protocol) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(protocol): - codeAndComment = protocol.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/readout_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/readout_links.py deleted file mode 100644 index d645772e58338333f59d03ded728c979260b8ad7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/readout_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(readouts_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - readoutPath= "/YLAB-TEST/" + readouts_list - permId =entityInformationProvider().getSamplePermId(SPACE, readouts_list) - if not permId: - permId = readouts_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, readouts_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - readouts_list = item.get('CODE') - comment_list = item.get('COMMENT') - if readouts_list: - sampleLink = _createSampleLink(readouts_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for readout in elements: - readouts_list = readout.getAttribute(ATR_CODE, "") - name = readout.getAttribute(ATR_NAME,"") - comment_list=readout.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, readout, readouts_list) - row.setCell(CODE_LABEL, readouts_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new readout, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new readout relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRR')\ - .setDescription('Code of readout, e.g. "FRR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected readout relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of readout sample, e.g. "FRR1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected readout relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new readout element with values from input fields - and add it to existing elements. - """ - readouts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(readouts_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the readout element corresponding to selected row - and replace it with an element with values from input fields. - """ - readouts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(readouts_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete readouts that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - readouts = input.split(',') - for readout in readouts: - (code, comment) = _extractCodeAndComment(readout) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(readout): - codeAndComment = readout.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solution_buffers_quantity_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solution_buffers_quantity_links.py deleted file mode 100644 index bdf590f636a6aaaeb8ed2f61654929463805a4b8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solution_buffers_quantity_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling SOLUTIONS BUFFERS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(buffers_list, buffer_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bufferPath= "/YEAST_LAB/" + buffers_list - permId =entityInformationProvider().getSamplePermId(SPACE, buffers_list) - if not permId: - permId = buffers_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, buffer_quantity_list) - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, QUANTITY_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - buffers_list = item.get('CODE') - buffer_quantity_list = item.get('QUANTITY') - if buffers_list: - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(QUANTITY_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for buffer in elements: - buffers_list = buffer.getAttribute(ATR_CODE, "") - name = buffer.getAttribute(ATR_NAME,"") - buffer_quantity_list=buffer.getAttribute(ATR_QUANTITY, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, buffer, buffers_list) - row.setCell(CODE_LABEL, buffers_list) - row.setCell(NAME_LABEL,name) - row.setCell(QUANTITY_LABEL, buffer_quantity_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new buffer, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new buffer relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of buffer, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected buffer relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of buffer sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(QUANTITY_LABEL)\ - .setMandatory(True)\ - .setDescription('Quantity of the buffer sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(QUANTITY_LABEL, QUANTITY_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected buffer relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new buffer element with values from input fields - and add it to existing elements. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_quantity_list = action.getInputValue(QUANTITY_LABEL) - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the buffer element corresponding to selected row - and replace it with an element with values from input fields. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_quantity_list = action.getInputValue(QUANTITY_LABEL) - - - - sampleLink = _createSampleLink(buffers_list, buffer_quantity_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete buffers that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - buffers = input.split(',') - for buffer in buffers: - (code, quantity) = _extractCodeAndQuantity(buffer) - sampleLink = _createSampleLink(code, quantity) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndQuantity(buffer): - codeAndQuantity = buffer.split(':') - if (len(codeAndQuantity) == 2): - return (codeAndQuantity[0].strip(), codeAndQuantity[1].strip()) - else: - return (codeAndQuantity[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solutions_buffers_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solutions_buffers_links.py deleted file mode 100644 index 34501031b8140dd2bc6b2edfe9a97bf0a4acf949..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/solutions_buffers_links.py +++ /dev/null @@ -1,218 +0,0 @@ -""" -Managed Property Script for handling SOLUTIONS BUFFERS. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_CONC = "concentration" -ATR_NAME = "name" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -NAME_LABEL = "name" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(buffers_list, buffer_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - bufferPath= "/YEAST_LAB/" + buffers_list - permId =entityInformationProvider().getSamplePermId(SPACE, buffers_list) - if not permId: - permId = buffers_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffer_concentration_list) - return sampleLink - - -""" -Example input: - -FRSOB1: 3nM, FRSOB2, FRSOB3: 4nM -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, CONC_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - buffers_list = item.get('CODE') - buffers_concentration_list = item.get('CONCENTRATION') - if buffers_list: - sampleLink = _createSampleLink(buffers_list, buffers_concentration_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(CONC_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for buffer in elements: - buffers_list = buffer.getAttribute(ATR_CODE, "") - name = buffer.getAttribute(ATR_NAME,"") - buffer_concentration_list=buffer.getAttribute(ATR_CONC, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, buffer, buffers_list) - row.setCell(CODE_LABEL, buffers_list) - row.setCell(NAME_LABEL,name) - row.setCell(CONC_LABEL, buffer_concentration_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new buffer, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new buffer relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRC')\ - .setDescription('Code of buffer, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected buffer relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of buffer sample, e.g. "FRC1"'), - inputWidgetFactory().createTextInputField(CONC_LABEL)\ - .setMandatory(True)\ - .setDescription('Concentration of the buffer sample, e.g. "1M"'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(CONC_LABEL, CONC_LABEL) - - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected buffer relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new buffer element with values from input fields - and add it to existing elements. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the buffer element corresponding to selected row - and replace it with an element with values from input fields. - """ - buffers_list = action.getInputValue(CODE_LABEL) - buffer_concentration_list = action.getInputValue(CONC_LABEL) - - - - sampleLink = _createSampleLink(buffers_list, buffer_concentration_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete buffers that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - buffers = input.split(',') - for buffer in buffers: - (code, concentration) = _extractCodeAndConcentration(buffer) - sampleLink = _createSampleLink(code, concentration) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndConcentration(buffer): - codeAndConcentration = buffer.split(':') - if (len(codeAndConcentration) == 2): - return (codeAndConcentration[0].strip(), codeAndConcentration[1].strip()) - else: - return (codeAndConcentration[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/western_blot_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/western_blot_links.py deleted file mode 100644 index 5e0b698152bd15d6dce10834e2407cd9d6521c7c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/western_blot_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling WB samples. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(wbs_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - wbPath= "/YLAB-TEST/" + wbs_list - permId =entityInformationProvider().getSamplePermId(SPACE, wbs_list) - if not permId: - permId = wbs_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, wbs_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - wbs_list = item.get('CODE') - comment_list = item.get('COMMENT') - if wbs_list: - sampleLink = _createSampleLink(wbs_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for wb in elements: - wbs_list = wb.getAttribute(ATR_CODE, "") - name = wb.getAttribute(ATR_NAME,"") - comment_list=wb.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, wb, wbs_list) - row.setCell(CODE_LABEL, wbs_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new wb, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new wb relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRWB')\ - .setDescription('Code of wb, e.g. "FRWB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected wb relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of wb sample, e.g. "FRWB1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected wb relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new wb element with values from input fields - and add it to existing elements. - """ - wbs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(wbs_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the wb element corresponding to selected row - and replace it with an element with values from input fields. - """ - wbs_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(wbs_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete wbs that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - wbs = input.split(',') - for wb in wbs: - (code, comment) = _extractCodeAndComment(wb) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(wb): - codeAndComment = wb.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast parents.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast parents.py deleted file mode 100644 index eb013fcfd6c93c3ae95ad7b4fd65fdaf5d769365..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast parents.py +++ /dev/null @@ -1,182 +0,0 @@ -""" -Managed Property Script for handling YEAST parents of YEAST samples. - -@author: Piotr Buczek -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""plasmid_list attribute name""" -ATR_CODE = "code" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(plasmid_list): - """ - Creates sample link XML element for sample with specified 'plasmid_list'. The element will contain - given plasmid_list as 'plasmid_list' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'plasmid_list' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample plasmid_list="FRP1" permId="20110309154532868-4219"/>' - - '<Sample plasmid_list="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - plasmidPath= "/YEAST_LAB/" + plasmid_list - permId = entityInformationProvider().getSamplePermId(SPACE, plasmid_list) - if not permId: - permId = plasmid_list - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, plasmid_list) - - return sampleLink - - -""" -Example input: - -FRY1, FRY2, FRY3, FRY4 -""" - -#def showRawValueInForms(): - # return False - -#def batchColumnNames(): -# return [CODE_LABEL] - -#def updateFromRegistrationForm(bindings): -# elements = [] -# for item in bindings: -# plasmid_list = item.get('CODE') -# sampleLink = _createSampleLink(plasmid_list) - # elements.append(sampleLink) - -# property.value = propertyConverter().convertToString(elements) - - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - samples = input.split(',') - for plasmid_list in samples: - sampleLink = _createSampleLink(plasmid_list.strip()) - elements.append(sampleLink) - property.value = propertyConverter().convertToString(elements) - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for plasmid in elements: - plasmid_list = plasmid.getAttribute(ATR_CODE, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, plasmid, plasmid_list) - row.setCell(CODE_LABEL, plasmid_list) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new yeast parent, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new plasmid relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRY')\ - .setDescription('Code of yeast parent sample, e.g. "FRY1"') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected plasmid relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of yeast parent sample, e.g. "FRY1"') - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected yeast parent relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new yeast parent element with values from input fields - and add it to existing elements. - """ - plasmid_list = action.getInputValue(CODE_LABEL) - sampleLink = _createSampleLink(plasmid_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the yeast parent element corresponding to selected row - and replace it with an element with values from input fields. - """ - plasmid_list = action.getInputValue(CODE_LABEL) - sampleLink = _createSampleLink(plasmid_list) - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete yeast parents that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast_links.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast_links.py deleted file mode 100644 index 98428a0c4ff9acc9d1b80f742b74f5bc9871c949..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_legacy/yeast_links.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Managed Property Script for handling Readouts. - - -""" - -import re - -""""space that all parents come from (fixed)""" -SPACE = "YEAST_LAB" - -"""code attribute name""" -ATR_CODE = "code" -ATR_NAME = "name" -ATR_COMMENT = "comment" - -"""labels of table columns""" -LINK_LABEL = "link" -CODE_LABEL = "code" -NAME_LABEL = "name" -COMMENT_LABEL = "comment" - -"""action labels""" - -ADD_ACTION_LABEL = "Add" -EDIT_ACTION_LABEL = "Edit" -DELETE_ACTION_LABEL = "Delete" - -"""helper functions""" - -def _createSampleLink(yeasts_list, comment_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - yeastPath= "/YLAB-TEST/" + yeasts_list - permId =entityInformationProvider().getSamplePermId(SPACE, yeasts_list) - if not permId: - permId = yeasts_list - name = entityInformationProvider().getSamplePropertyValue(permId, 'NAME') - print "the name is", name - sampleLink = elementFactory().createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, yeasts_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_COMMENT, comment_list) - - return sampleLink - - -""" -Example input: - -FRC1, FRC2, FRC3, FRC4 -""" - - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [CODE_LABEL, COMMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - yeasts_list = item.get('CODE') - comment_list = item.get('COMMENT') - if yeasts_list: - sampleLink = _createSampleLink(yeasts_list, comment_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def configureUI(): - """Create table builder and add columns.""" - tableBuilder = createTableBuilder() - tableBuilder.addHeader(LINK_LABEL) - tableBuilder.addHeader(CODE_LABEL) - tableBuilder.addHeader(NAME_LABEL) - tableBuilder.addHeader(COMMENT_LABEL) - - """The property value should contain XML with list of samples. Add a new row for every sample.""" - elements = list(propertyConverter().convertToElements(property)) - for yeast in elements: - yeasts_list = yeast.getAttribute(ATR_CODE, "") - name = yeast.getAttribute(ATR_NAME,"") - comment_list=yeast.getAttribute(ATR_COMMENT, "") - - row = tableBuilder.addRow() - row.setCell(LINK_LABEL, yeast, yeasts_list) - row.setCell(CODE_LABEL, yeasts_list) - row.setCell(NAME_LABEL, name) - row.setCell(COMMENT_LABEL, comment_list) - - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new yeast, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add new yeast relationship:') - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setValue('FRY')\ - .setDescription('Code of yeast, e.g. "FRY1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comment') - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected yeast parent, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected yeast relationship:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createTextInputField(CODE_LABEL)\ - .setMandatory(True)\ - .setDescription('Code of yeast sample, e.g. "FRY1"'), - inputWidgetFactory().createMultilineTextInputField(COMMENT_LABEL)\ - .setMandatory(True)\ - .setDescription('Comments'), - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(CODE_LABEL, CODE_LABEL) - editAction.addBinding(COMMENT_LABEL, COMMENT_LABEL) - - - """ - 3. delete selected yeast parents. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete the selected yeast relationships?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new yeast element with values from input fields - and add it to existing elements. - """ - yeasts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - sampleLink = _createSampleLink(yeasts_list, comment_list) - - elements.append(sampleLink) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the yeast element corresponding to selected row - and replace it with an element with values from input fields. - """ - yeasts_list = action.getInputValue(CODE_LABEL) - comment_list = action.getInputValue(COMMENT_LABEL) - - - sampleLink = _createSampleLink(yeasts_list, comment_list) - - - - selectedRowId = action.getSelectedRows()[0] - elements[selectedRowId] = sampleLink - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete yeasts that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - yeasts = input.split(',') - for yeast in yeasts: - (code, comment) = _extractCodeAndComment(yeast) - sampleLink = _createSampleLink(code, comment) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - -def _extractCodeAndComment(yeast): - codeAndComment = yeast.split(':') - if (len(codeAndComment) == 2): - return (codeAndComment[0].strip(), codeAndComment[1].strip()) - else: - return (codeAndComment[0].strip(), "n.a.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_managed.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_managed.py deleted file mode 100644 index bb989c087c50af5773c750fa5191e2d83a02848f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/disabled_managed.py +++ /dev/null @@ -1,46 +0,0 @@ -def configureUI(): - tableBuilder = createTableBuilder() - - ## - ## Headers - ## - tableBuilder.addHeader("message") - usedTableHeaders = {"message" : True} - samples = list(propertyConverter().convertToElements(property)) - for sample in samples: - for annotation in sample.getAttributes(): - if annotation not in usedTableHeaders: - tableBuilder.addHeader(annotation) - usedTableHeaders[annotation] = True - - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - ## - ## Data - ## - row = tableBuilder.addRow() - row.setCell("message", "Please use the new managed properties annotations, legacy functionality is disabled.") - - for sample in samples: - row = tableBuilder.addRow() - for annotation in sample.getAttributes(): - row.setCell(annotation, sample.getAttribute(annotation)) - - -def updateFromUI(action): - raise Exception("Please use the new managed properties annotations, legacy functionality is disabled.") - -## -## Batch Import Methods -## -def batchColumnNames(): - allTypes = [] - return allTypes - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - raise Exception("Please use the new managed properties annotations, legacy functionality is disabled.") \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/compatibility/managed.py b/plasmid/source/core-plugins/stellingmigration/1/compatibility/managed.py deleted file mode 100644 index 16115f20ccd8bd3709d1f352f3d4dcb3f5e9180e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/compatibility/managed.py +++ /dev/null @@ -1,305 +0,0 @@ -from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider - -## -## Configuration -## - -# This needs to be edited for each sample type to match the Profile.js ANNOTATION_PROPERTIES map. -configuration = {} - -configuration["GENERAL_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False }, - "SOLUTION_BUFFERS" : {"QUANTITY" : False }, - "MEDIA" : {"QUANTITY" : False }, - "ENZYME" : {"CONCENTRATION" : False } - }; - -configuration["MEDIA"] = { - "CHEMICAL" : {"CONCENTRATION" : False }, - "SOLUTION_BUFFERS" : {"CONCENTRATION" : False }, - "MEDIA" : {"CONCENTRATION" : False } - }; - -configuration["PCR"] = { - "CHEMICAL" : {"QUANTITY" : False }, - "SOLUTION_BUFFERS" : {"QUANTITY" : False }, - "ENZYME" : {"CONCENTRATION" : False } - }; - -configuration["POMBE"] = { - "POMBE" : {}, #Just a placeholder, is actually used by the Plasmids of the Pombe to create the links - "PLASMID" : {"PLASMID_ANNOTATION" : False, "PLASMID_RELATIONSHIP" : False, "COMMENTS" : False, "CONTAINED" : False } - }; - -configuration["READOUT"] = { - "CHEMICAL" : {"QUANTITY" : False }, - "SOLUTION_BUFFERS" : {"QUANTITY" : False } - }; - -configuration["RESULT"] = { - "CHEMICAL" : {"QUANTITY" : False, "DETAIL" : False } - }; - -configuration["SOLUTION_BUFFERS"] = { - "CHEMICAL" : {"CONCENTRATION" : False }, - "SOLUTION_BUFFERS" : {"CONCENTRATION" : False } - }; - -configuration["WESTERN_BLOTTING"] = { - "CHEMICAL" : {"QUANTITY" : False }, - "SOLUTION_BUFFERS" : {"QUANTITY" : False }, - "ANTIBODY" : {"QUANTITY" : False } - }; - -configuration["YEAST"] = { - "YEAST" : {}, #Just a placeholder, is actually used by the Plasmids of the Yeast to create the links - "PLASMID" : {"PLASMID_ANNOTATION" : False, "PLASMID_RELATIONSHIP" : False, "COMMENTS" : False, "CONTAINED" : False } - }; - -configurationCopyParents = {} -configurationCopyParents["YEAST"] = { "YEAST" : "PLASMID" }; -configurationCopyParents["POMBE"] = { "POMBE" : "PLASMID" }; - -#Global Variables -annotableType = "<REPLACE_WITH_ANNOTABLE_TYPE>" -server = CommonServiceProvider.getCommonServer() -contextOrNull = server.tryToAuthenticateAsSystem() -propertyTypes = server.listPropertyTypes(contextOrNull.getSessionToken(), False) - -## -## Help Methods -## -def getAllAnnotableSampleTypesForType(fromAnnotableType): - allTypes = {}; - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - allTypes[sampleTypeWithAnnotationsForType] = True; - return allTypes; - -def getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCodeToFind, fromAnnotableType): - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - if sampleTypeWithAnnotationsForType == sampleTypeCodeToFind: - return configuration[sampleTypeWithAnnotations][sampleTypeWithAnnotationsForType]; - return None; - -def getPropertyType(propertyTypeCode): - for propertyType in propertyTypes: - if propertyType.code == propertyTypeCode: - return propertyType - return None; - -def createAnnotationsFor(identifier, annotations, sampleType): - permId = entityInformationProvider().getSamplePermId(identifier); - newAnnotation = elementFactory().createSampleLink(permId) - - newAnnotation.addAttribute("identifier", identifier) - newAnnotation.addAttribute("sampleType", sampleType) - for annotation in annotations: - newAnnotation.addAttribute(annotation, annotations[annotation]) - return newAnnotation - -def getWidgetForAdd(sampleTypeCode, annotableType): - #print "sampleTypeCode:" + sampleTypeCode + " - " + annotableType #Deleting this comment causes the thing to break - widgets = [] - widgetIdentifier = inputWidgetFactory().createTextInputField("identifier")\ - .setMandatory(True)\ - .setValue("")\ - .setDescription("") - widgets.append(widgetIdentifier) - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - widget = inputWidgetFactory().createTextInputField(propertyType.label)\ - .setMandatory(getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType)[propertyTypeCode])\ - .setValue("")\ - .setDescription(propertyType.description) - widgets.append(widget) - return widgets; - -def isValid(dataType, value): - return True - -## -## Registration form (EXPERIMENTAL) -## -# def showRawValueInForms(): -# return False -# -# def inputWidgets(): -# widgetsToCopyFrom = [] -# toCopyFrom = configurationCopyParents[annotableType] -# if(toCopyFrom is not None): -# for key in toCopyFrom: -# widgetsToCopyFrom.append(inputWidgetFactory().createTextInputField(key + " to copy " + toCopyFrom[key]).setMandatory(False)) -# print "EXECUTING inputWidgets " + str(len(widgetsToCopyFrom)) -# return widgetsToCopyFrom -# -# def updateFromRegistrationForm(bindings): -# print "EXECUTING updateFromRegistrationForm" -# for key, value in bindings: -# print "MANAGED WITH KEY: " + key - -## -## Main Methods -## -def configureUI(): - # Add Headers - tableBuilder = createTableBuilder() - tableBuilder.addHeader("identifier") - tableBuilder.addHeader("sampleType") - tableBuilder.addHeader("name") - - usedTableHeaders = {"identifier" : True, "sampleType" : True, "name" : True } - - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - if propertyTypeCode not in usedTableHeaders: - tableBuilder.addHeader(propertyTypeCode) - usedTableHeaders[propertyTypeCode] = True - - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - # Add Rows - samples = list(propertyConverter().convertToElements(property)) - for sample in samples: - row = tableBuilder.addRow() - permId = sample.getAttribute("permId") - - #Set Name - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "NAME") - if (nameValue is None) or (len(nameValue) == 0): - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "PLASMID_NAME") #For PLASMID Sample Type - if (nameValue is None) or (len(nameValue) == 0): - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "YEAST_STRAIN_NAME") #For YEAST Sample Type - if (nameValue is None) or (len(nameValue) == 0): - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "BACTERIA_STRAIN_NAME") #For BACTERIA Sample Type - if (nameValue is None) or (len(nameValue) == 0): - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "TARGET") #For OLIGO Sample Type - if nameValue is not None: - row.setCell("name", nameValue) - - for annotation in sample.getAttributes(): - if annotation != "permId" and annotation != "NAME": - row.setCell(annotation, sample.getAttribute(annotation)) - - # Add Create buttons - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - title = "Add " + sampleTypeCode; - addAction = uiDescription.addTableAction(title).setDescription(title) - widgets = getWidgetForAdd(sampleTypeCode, annotableType) - addAction.addInputWidgets(widgets) - - # TO-DO Edit button for each type with different hooks to the columns depending on the type - # Add Edit Button (EXPERIMENTAL) -# editAction = uiDescription.addTableAction('Edit').setDescription('Edit selected table row') -# editAction.setRowSelectionRequiredSingle() -# editWidgets = [] -# for headerKey in usedTableHeaders: -# editWidgets.append(inputWidgetFactory().createTextInputField(headerKey)) -# editAction.addBinding(headerKey, headerKey) -# editAction.addInputWidgets(editWidgets) - - # Add Delete button - deleteAction = uiDescription.addTableAction("Delete")\ - .setDescription('Are you sure you want to delete selected annotation?') - deleteAction.setRowSelectionRequired() # Delete is enabled when at least 1 row is selected. - -def updateFromUI(action): - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - if action.name.startswith("Add"): - sampleTypeCode = action.name[4:] - identifier = action.getInputValue("identifier") - annotations = { } - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - propertyTypeValue = action.getInputValue(propertyType.label) - if not isValid(propertyType.dataType, propertyTypeValue): - raise ValidationException("Property " + str(propertyType.label) + " with invalid value " + str(propertyTypeValue)) - if propertyTypeValue is None: - propertyTypeValue = "" - annotations[propertyTypeCode] = propertyTypeValue - newAnnotation = createAnnotationsFor(identifier, annotations, sampleTypeCode) - elements.append(newAnnotation) - - if action.name.startswith("Delete"): - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - - property.value = converter.convertToString(elements) - -## -## Batch Import Methods -## -def batchColumnNames(): - allTypes = [] - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - allTypes.append(sampleTypeCode) - return allTypes - -def updateFromBatchInput(bindings): - #print "--------> UPDATE FROM BATCH INPUT: " - elements = [] - - #Links Configuration - typesToCopyFrom = [] - if annotableType in configurationCopyParents: - typesToCopyFrom = configurationCopyParents[annotableType] - - for annotableSampleType in getAllAnnotableSampleTypesForType(annotableType): - annotatedSamples = bindings.get(annotableSampleType) - #print "-----> TYPE: " + str(annotableSampleType) + " BINDINGS: " + str(annotatedSamples) - if (annotatedSamples != None and annotatedSamples != ""): - #Annotations - #print "-----> Annotations" - if annotableSampleType not in typesToCopyFrom: - for sampleLine in annotatedSamples.split("\\"): - propertyTypes = getPropertyTypesForSampleTypeFromAnnotableType(annotableSampleType, annotableType) - identifier = None - permId = None - sampleLink = None - for sampleProperty in sampleLine.split(";"): - propertyName = sampleProperty.split(":")[0] - propertyValue = sampleProperty.split(":")[1] - if propertyName == "identifier": - identifier = propertyValue - permId = entityInformationProvider().getSamplePermId(propertyValue) - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(propertyName, propertyValue) - sampleLink.addAttribute('sampleType', annotableSampleType) - elif propertyName in propertyTypes: - sampleLink.addAttribute(propertyName, propertyValue) - else: - raise NameError('Found invalid property: ' + propertyName + " on type " + annotableSampleType) - if identifier is not None: - elements.append(sampleLink) - #Links - #print "-----> links" - for typeToCopyFrom in typesToCopyFrom: - typeToCopy = typesToCopyFrom[typeToCopyFrom] - #print "-----> TYPE TO COPY FROM: " + str(typeToCopyFrom) - #print "-----> TYPE TO COPY: " + str(typeToCopy) - identifiersToCopyFrom = bindings.get(typeToCopyFrom) - if identifiersToCopyFrom is not None: - #print "-----> IDENTIFIERS TO COPY FROM: " + str(identifiersToCopyFrom) - identifiersForCopy = identifiersToCopyFrom.split(',') - for identifierToCopyFrom in identifiersForCopy: - #print "-----> IDENTIFIER TO COPY FROM: " + str(identifierToCopyFrom) - permIdFromIdentifier = entityInformationProvider().getSamplePermId(identifierToCopyFrom) - #print "-----> PERMID TO COPY FROM: " + str(permIdFromIdentifier) - parentsToCopyFromPermId = entityInformationProvider().getSamplePropertyValue(permIdFromIdentifier, "ANNOTATIONS_STATE") - #print "-----> ELEMENTS TO COPY: " + str(parentsToCopyFromPermId) - parentElements = list(propertyConverter().convertStringToElements(parentsToCopyFromPermId)) - for parentAnnotation in parentElements: - if parentAnnotation.getAttribute("sampleType") == typeToCopy: - parentAnnotation.addAttribute("CONTAINED", identifierToCopyFrom) - #print "-----> COPYING: " + str(parentAnnotation.getAttribute('identifier')) - elements.append(parentAnnotation) - property.value = propertyConverter().convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/consistency.py b/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/consistency.py deleted file mode 100644 index 411afcede1b08da8abd2acee36d935b4b2458081..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/consistency.py +++ /dev/null @@ -1,338 +0,0 @@ -# some_file.py -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType -import xml.etree.ElementTree as ET - -## -## Definitions -## -UPDATES_ENABLED = False -updatesToExecute = {} - -sampleTypesToVerify = ["YEAST","POMBE"] -logLevelsToPrint = ["ERROR", "REPORT", "MANUAL-FIX", "LOSTDEBUG", "UPDATED", "COUNTER"] #INFO not included, use it for debug only - -## -## Logging -## - -numberOfManualFixes = 0 -numberOfAutoFixesDeletes = 0 -numberOfAutoFixesLost = 0 -numberOfCanBeUpdated = 0 - -def logManualFix(message, creator, sampleIdentifier, affectedSampleToBeAnnotated, creatorOfAncestor, ancestor): - log("MANUAL-FIX", message + "\t" + creator + "\t" + sampleIdentifier + "\t" + affectedSampleToBeAnnotated + "\t" + creatorOfAncestor + "\t" + ancestor) - -def log(level, message): - if level == "MANUAL-FIX": - global numberOfManualFixes - numberOfManualFixes = numberOfManualFixes + 1 - if level == "AUTO-FIX": - global numberOfAutoFixesDeletes - numberOfAutoFixesDeletes = numberOfAutoFixesDeletes + 1 - if level == "AUTO-FIX-2": - global numberOfAutoFixesLost - numberOfAutoFixesLost = numberOfAutoFixesLost + 1 - if level in logLevelsToPrint: - print "[" + level + "] " + message - -## -## Cache -## -currentCache = [] - -def getSampleFromCache(identifier): - sampleToReturn = None - for sample in currentCache: - if sample.getSampleIdentifier() == identifier: - return sample - return None - -## -## Search -## - -def getSamplesByType(tr, sampleType): - criteria = SearchCriteria() - criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) - criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.TYPE, sampleType)) - samples = tr.getSearchService().searchForSamples(criteria) - return samples - -def getSampleByPermId(tr, permId): - criteria = SearchCriteria() - criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) - criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.PERM_ID, permId)) - samples = tr.getSearchService().searchForSamples(criteria) - if len(samples) is 1: - return samples[0] - else: - return None - -## -## Main Methods -## -def process(tr): - log("REPORT", "START VERIFICATION REPORT!") - logManualFix("MANUAL-FIX", "AFFECTED SAMPLE CREATOR", "AFFECTED SAMPLE", "ANNOTATION OF AFFECTED SAMPLE", "AFFECTED ANCESTOR CREATOR", "AFFECTED ANCESTOR") - for sampleType in sampleTypesToVerify: - samples = getSamplesByType(tr, sampleType) - global currentCache - currentCache.extend(samples) - print sampleType + ": "+ str(len(samples)) - for sample in samples: - verify(tr, sample) - - global numberOfManualFixes - global numberOfAutoFixesDeletes - global numberOfAutoFixesLost - global numberOfCanBeUpdated - log("REPORT", "FOUND " + str(numberOfAutoFixesDeletes) + " AUTOMATIC DELETE FIXES!") - log("REPORT", "FOUND " + str(numberOfAutoFixesLost) + " AUTOMATIC LOST FIXES!") - log("REPORT", "UPDATABLE " + str(numberOfCanBeUpdated) + " SAMPLES!") - log("REPORT", "REQUIRED " + str(numberOfManualFixes-1) + " MANUAL FIXES!") #-1 For the Header - log("REPORT", "RUNNING UPDATES!") - global updatesToExecute; - for sampleIdentifierToUpdate in updatesToExecute: - sample = getSampleFromCache(sampleIdentifierToUpdate) - newAnnotations = updatesToExecute[sampleIdentifierToUpdate] - global numberOfCanBeUpdated; - numberOfCanBeUpdated = numberOfCanBeUpdated + 1; - log("UPDATED", "Updated: " + sample.getSampleIdentifier() + " - "+ str(newAnnotations)) - sample = tr.makeSampleMutable(sample); - #1. Create new annotations XML - newAnnotationsRoot = ET.Element("root"); - counter = {}; - for newAnnotation in newAnnotations: - addCount(counter, newAnnotation["identifier"]) - newAnnotationsNode = ET.SubElement(newAnnotationsRoot, "Sample") - for newAttribute in newAnnotation: - newAnnotationsNode.attrib[newAttribute] = newAnnotation[newAttribute]; - if getValueOrNull(newAnnotation, "PLASMID_RELATIONSHIP") == "LOT": #2. Add LOST parents - log("LOSTDEBUG", "Adding lost Parent " + newAnnotation["identifier"]); - parents = sample.getParentSampleIdentifiers(); - parents.add(newAnnotation["identifier"]); - sample.setParentSampleIdentifiers(parents); - log("LOSTDEBUG", "Adding lost Parent list" + str(sample.getParentSampleIdentifiers())); - printCount(sample, counter) - sample.setPropertyValue("ANNOTATIONS_STATE", ET.tostring(newAnnotationsRoot, encoding='utf-8')); - log("REPORT", "UPDATES FINISH!") - log("REPORT", "FINISH VERIFICATION REPORT!") - #raise Exception("Test"); - -def addCount(counter, identifier): - value = 0 - if(identifier in counter): - value = counter[identifier] - value = value + 1 - counter[identifier] = value - -def printCount(sample, counter): - for identifier in counter: - value = counter[identifier] - if value > 1: - log("COUNTER", sample.getSample().getRegistrator().getUserId() + " " + sample.getSampleIdentifier() + " " + identifier + " " + str(value)) - -def verify(tr, sample): - newAnnotations = []; - newAnnotationsReady = True; - annotationsRoot = getAnnotationsRootNodeFromSample(sample) - #1.Annotations hierarchy - requiredAnnotationsFound = getRequiredAnnotations(sample) #To detect case 4 - requiredAnnotationsFromParents = getRequiredAnnotationsFromParents(sample) #To detect case 5 - if annotationsRoot is not None: - for annotation in annotationsRoot: - if getValueOrNull(annotation.attrib, "PLASMID_RELATIONSHIP") == "LOT": #Skip auto generated lot - continue; - annotatedSampleIdentifier = annotation.attrib["identifier"] #Identifier from annotated sample - requiredAnnotationsFound[annotatedSampleIdentifier] = True - requiredAnnotationsFromParents[annotatedSampleIdentifier] = True - try: - if isChild(sample, annotatedSampleIdentifier): - #This is an annotation from a parent, this is by default correct and don't needs further inspection. - newAnnotations.append(getAnnotationMap(annotation)); - log("INFO", "GOOT ANNOTATION AT SAMPLE: " + sample.getSampleIdentifier() + " ANNOTATION: " + annotatedSampleIdentifier) - else: - foundAnnotationAndAncestor = getAnnotationAndAncestor(annotatedSampleIdentifier, sample.getParentSampleIdentifiers()) - foundAnnotation = foundAnnotationAndAncestor[0] - foundAncestor = foundAnnotationAndAncestor[1] - if foundAnnotation is not None and foundAncestor is not None: - log("INFO", "BAD ANNOTATION FOUND - ON:" + sample.getSampleIdentifier() + " ANNOTATION:" + annotatedSampleIdentifier) - if areAnnotationsEqual(annotation, foundAnnotation) and areAnnotationsEqual(foundAnnotation, annotation): - log("AUTO-FIX", "CASE 1 - GOOD REPEATED ANNOTATION THAT CAN BE DELETED - AT SAMPLE: " + sample.getSampleIdentifier() + " FOR ANNOTATION: " + annotatedSampleIdentifier + " FOUND ORIGINAL AT: " + foundAncestor.getSampleIdentifier()) - else: - logManualFix("Case 3 - The annotation is different on the sample and his ancestor.", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), annotatedSampleIdentifier, foundAncestor.getSample().getRegistrator().getUserId(), foundAncestor.getSampleIdentifier()) - newAnnotationsReady = False - elif foundAncestor is None: - logManualFix("Case 1 - The annotated sample is not an ancestor, is missing on the hierarchy for some reason.", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), annotatedSampleIdentifier, "?", "?") - newAnnotationsReady = False - elif foundAnnotation is None: - logManualFix("Case 2 - The annotated sample is not annotated on the appropriate ancestor.", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), annotatedSampleIdentifier, foundAncestor.getSample().getRegistrator().getUserId(), foundAncestor.getSampleIdentifier()) - newAnnotationsReady = False - except Exception, err: - log("ERROR", "PROCESSING ANNOTATIONS XML CHILD " + sample.getSampleIdentifier() + " ERR: " + str(err)) - #2.Missing Parents Annotations - for parentIdentifier in requiredAnnotationsFound: - if not requiredAnnotationsFound[parentIdentifier]: - logManualFix("Case 4 - Missing annotation on sample for parent.", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), parentIdentifier, "-", "-") - newAnnotationsReady = False - #3.Missing Annotations LOST - log("LOSTDEBUG", "Lost debug: " + sample.getSampleIdentifier() + " " + str(requiredAnnotationsFromParents)); - for parentAnnotationIdentifier in requiredAnnotationsFromParents: - if not requiredAnnotationsFromParents[parentAnnotationIdentifier]: - lostPermId = getRequiredAnnotationsFromParentsPermId(sample, parentAnnotationIdentifier) - if lostPermId is None: - raise Exception("Lost PermId Not Found"); - newAnnotations.append({ "permId" : lostPermId, "identifier" : parentAnnotationIdentifier, "PLASMID_RELATIONSHIP" : "LOT" }); - log("AUTO-FIX-2", "CASE 2 - MISSING LOST ANNOTATIONS ON SAMPLE: " + sample.getSampleIdentifier() + " FOR LOST ANNOTATION: " + parentAnnotationIdentifier + " PRESENT INTO ONE OF THE PARENTS") - #4 Check parents from contained - expectedParents = getContainedFromAnnotations(sample) - lostParents = areParentsPresent(sample, expectedParents) - if len(lostParents) > 0: - logManualFix("Case 5 - Missing Parents present in Contained: ", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), str(lostParents), "?", "?") - newAnnotationsReady = False - #5 Check repeated parents in annotations -# if areAnnotationDuplicated(sample): -# logManualFix("Case 6 - Same annotation coming from different parents: ", sample.getSample().getRegistrator().getUserId(), sample.getSampleIdentifier(), "?", "?", "?") -# newAnnotationsReady = False - global UPDATES_ENABLED; - if newAnnotationsReady and UPDATES_ENABLED: - global numberOfCanBeUpdated; - updatesToExecute[sample.getSampleIdentifier()] = newAnnotations; - log("UPDATED", "Ready to updated: " + sample.getSampleIdentifier() + " - "+ str(newAnnotations)) - elif not newAnnotationsReady: - log("UPDATED", "Not ready for update: " + sample.getSampleIdentifier()); - else: - log("UPDATED", "Not updated but ready:" + sample.getSampleIdentifier() + " - "+ str(newAnnotations)) - -def areAnnotationDuplicated(sample): - annotated = {}; #They should be parents of the sample and not been missing - annotationsRoot = getAnnotationsRootNodeFromSample(sample); - if annotationsRoot is not None: - for annotation in annotationsRoot: - permId = getValueOrNull(annotation.attrib, "permId"); - if permId in annotated: - return True - else: - annotated[permId] = True - return False - -def getContainedFromAnnotations(sample): - contained = []; #They should be parents of the sample and not been missing - annotationsRoot = getAnnotationsRootNodeFromSample(sample); - if annotationsRoot is not None: - for annotation in annotationsRoot: - containedFound = getValueOrNull(annotation.attrib, "CONTAINED"); - if containedFound is not None and ('/' in containedFound): - contained.append(containedFound); - return contained; - -def areParentsPresent(sample, parents): - notPresent = []; - for parent in parents: - isPresent = (parent in sample.getParentSampleIdentifiers()) - if not isPresent: - notPresent.append(parent); - return notPresent - -def getRequiredAnnotationsFromParentsPermId(sample, identifier): - for parentIdentifier in sample.getParentSampleIdentifiers(): - if ("/FRY" in parentIdentifier) or ("/FRS" in parentIdentifier): #Only check Yeast and Pombe Parents - parent = getSampleFromCache(parentIdentifier) - parentAnnotationsRoot = getAnnotationsRootNodeFromSample(parent) - if parentAnnotationsRoot is not None: - for parentAnnotation in parentAnnotationsRoot: - parentAnnotationIdentifier = parentAnnotation.attrib["identifier"] - if "/FRP" in parentAnnotationIdentifier: #Only require Plasmids - if identifier == parentAnnotationIdentifier: - return parentAnnotation.attrib["permId"] - return None - -def getRequiredAnnotationsFromParents(sample): - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - START: " + sample.getSampleIdentifier()); - requiredAnnotationsFromParents = {} - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - parents: " + str(sample.getParentSampleIdentifiers())); - for parentIdentifier in sample.getParentSampleIdentifiers(): - if ("/FRY" in parentIdentifier) or ("/FRS" in parentIdentifier): #Only check Yeast and Pombe Parents - parent = getSampleFromCache(parentIdentifier) - parentAnnotationsRoot = getAnnotationsRootNodeFromSample(parent) - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - parent: " + parent.getSampleIdentifier() + " annotations " + str(sample.getPropertyValue("ANNOTATIONS_STATE"))); - if parentAnnotationsRoot is not None: - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - parent: " + parent.getSampleIdentifier() + " root not none"); - for parentAnnotation in parentAnnotationsRoot: - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - parent annotation: " + parent.getSampleIdentifier() + " " + str(parentAnnotation)); - parentAnnotationIdentifier = parentAnnotation.attrib["identifier"] - annotationType = getValueOrNull(parentAnnotation.attrib, "PLASMID_RELATIONSHIP"); - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - parent annotation: " + str(parentAnnotationIdentifier) + " " + str(annotationType)); - if "/FRP" in parentAnnotationIdentifier and ((annotationType is None) or (annotationType is not "LOT")): #Only require Plasmids not LOT - requiredAnnotationsFromParents[parentAnnotationIdentifier] = False - log("LOSTDEBUG", "getRequiredAnnotationsFromParents - FINISH: " + sample.getSampleIdentifier()); - return requiredAnnotationsFromParents - -def getRequiredAnnotations(sample): - requiredAnnotationsFound = {} - for parentIdentifier in sample.getParentSampleIdentifiers(): - if "/FRP" in parentIdentifier: #Only require Plasmids - requiredAnnotationsFound[parentIdentifier] = False - return requiredAnnotationsFound - -def getAnnotationMap(annotation): - map = {}; - for key in annotation.attrib: - value = getValueOrNull(annotation.attrib, key) - if value is not None: - map[key] = value; - return map - -def areAnnotationsEqual(annotationA, annotationB): - for key in annotationA.attrib: - value = getValueOrNull(annotationA.attrib, key) - if key != "CONTAINED": - if value != getValueOrNull(annotationB.attrib, key): - log("INFO", "EQUALITY FAILED FOR " + key + ": - " + str(value) + " " + str(getValueOrNull(annotationB.attrib, key))) - return False - return True - -def getValueOrNull(map, key): - if key in map: - value = map[key] - if not value: #Check for null strings - return None - else: - return value - else: - return None - -def getAnnotationAndAncestor(annotatedSampleIdentifier, sampleParentsIdentifiers): - ancestorsIdentifiers = list(sampleParentsIdentifiers) - while( len(ancestorsIdentifiers) > 0): - ancestorIdentifier = ancestorsIdentifiers.pop(0) - ancestor = getSampleFromCache(ancestorIdentifier) - if ancestor is not None: - if isChild(ancestor, annotatedSampleIdentifier): #We only accept annotations from the original sample to avoid test repetitions - ancestorAnnotationsRoot = getAnnotationsRootNodeFromSample(ancestor) - if ancestorAnnotationsRoot is not None: - for annotation in ancestorAnnotationsRoot: - if annotation.attrib["identifier"] == annotatedSampleIdentifier: - return [annotation, ancestor] - return [None, ancestor] - else: - ancestorsIdentifiers.extend(ancestor.getParentSampleIdentifiers()) - return [None, None] #Should never happen - -def isChild(sample, identifier): - if any(identifier in s for s in sample.getParentSampleIdentifiers()): - return True - else: - return False - -def getAnnotationsRootNodeFromSample(sample): - annotations = sample.getPropertyValue("ANNOTATIONS_STATE") - if '<root' in annotations: - try: - return ET.fromstring(annotations) - except Exception: - log("ERROR", "READING ANNOTATIONS XML FOR " + sample.getSampleIdentifier()) - return None \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/plugin.properties b/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/plugin.properties deleted file mode 100644 index 0f6f1d90c48e242d60dfd4418b4d55dc4f817fb6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingconsistency/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = consistency.py -dropbox-name = stellingconsistency -incoming-dir = ${root-dir}/stellingconsistency \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/migration.py b/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/migration.py deleted file mode 100644 index 1fa994b96dd2380d118c6dc412ae18d3b1719b63..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/migration.py +++ /dev/null @@ -1,239 +0,0 @@ -# some_file.py -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType -import xml.etree.ElementTree as ET - -## -## Generic Process Method -## - -definitions = { - "GENERAL_PROTOCOL" : - { - "CHEMICALS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "MEDIA" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "GENERAL_PROTOCOL" : { - "name" : "NAME" - }, - "ENZYMES" : { - "name" : "NAME", - "concentration" : "CONCENTRATION" - } - }, - "MEDIA" : - { - "CHEMICALS" : { - "concentration" : "CONCENTRATION", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "concentration" : "CONCENTRATION", - "name" : "NAME" - }, - "MEDIA" : { - "concentration" : "CONCENTRATION", - "name" : "NAME" - } - }, - "PCR" : - { - "CHEMICALS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "ENZYMES" : { - "name" : "NAME", - "concentration" : "CONCENTRATION" - } - }, - "POMBE" : - { - "PLASMIDS" : { - "annotation" : "PLASMID_ANNOTATION", - "rel" : "PLASMID_RELATIONSHIP" - } - }, - "READOUT" : - { - "CHEMICALS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "GENERAL_PROTOCOL" : { - "name" : "NAME" - } - }, - "RESULT" : - { - "ANNOTATIONS" : { - "quantity" : "QUANTITY", - "name" : "NAME", - "detail" : "DETAIL" - } - }, - "SOLUTIONS_BUFFERS" : - { - "CHEMICALS" : { - "concentration" : "CONCENTRATION", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "concentration" : "CONCENTRATION", - "name" : "NAME" - } - }, - "WESTERN_BLOTTING" : - { - "ANTIBODY" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "CHEMICALS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - }, - "SOLUTIONS_BUFFERS" : { - "quantity" : "QUANTITY", - "name" : "NAME" - } - }, - "YEAST" : - { - "PLASMIDS" : { - "annotation" : "PLASMID_ANNOTATION", - "rel" : "PLASMID_RELATIONSHIP" - } - } -}; - -currentCache = None - -def process(tr): - print "START!" - for sampleType in definitions: - properties = definitions[sampleType] - samples = getSamplesByType(tr, sampleType) - global currentCache - currentCache = samples - print sampleType + ": "+ str(len(samples)) - for sample in samples: - translate(tr, sample, properties) - print "FINISH!" - -def getSamplesByType(tr, sampleType): - criteria = SearchCriteria() - criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) - criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.TYPE, sampleType)) - samples = tr.getSearchService().searchForSamples(criteria) - return samples - -def getSampleByPermId(tr, permId): - criteria = SearchCriteria() - criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) - criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.PERM_ID, permId)) - samples = tr.getSearchService().searchForSamples(criteria) - if len(samples) is 1: - return samples[0] - else: - return None - -def getSampleFromCache(identifier): - sampleToReturn = None - for sample in currentCache: - if sample.getSampleIdentifier() == identifier: - return sample - return None - -def translate(tr, sample, properties): - sampleType = sample.getSampleType() - # Create new annotations from scratch - newAnnotations = sample.getPropertyValue("ANNOTATIONS_STATE") - newAnnotationsRoot = None - newAnnotationsRoot = ET.Element("root") - - # Read old annotations - for property in properties: - propertyDefinitions = properties[property] - oldAnnotationsRoot = None - try: - propertyValue = unicode(sample.getPropertyValue(property), "utf-8") - if '<root>' in propertyValue: - oldAnnotationsRoot = ET.fromstring(propertyValue) - except Exception: - print "[ERROR - PROCESSING PROPERTY_CODE] " + sample.code + " " + property - - if oldAnnotationsRoot is not None: - for child in oldAnnotationsRoot: - try: - permId = child.attrib["permId"] - linkedSample = getSampleByPermId(tr, permId) - linkedSampleIdentifier = linkedSample.getSampleIdentifier() - if property == "GENERAL_PROTOCOL": - #Don't migrate them, they should be parents and contain no information. - #sample.getParentSampleIdentifiers().add(linkedSampleIdentifier) - print "[PROTOCOL] " + sample.code + " " + linkedSampleIdentifier - else: - newAnnotationsNode = ET.SubElement(newAnnotationsRoot, "Sample") - print "[INFO - PROCESSING PERM_ID] " + sample.code + " " + permId - newAnnotationsNode.attrib["sampleType"] = linkedSample.sampleType - newAnnotationsNode.attrib["permId"] = permId - newAnnotationsNode.attrib["identifier"] = linkedSampleIdentifier - for oldName in propertyDefinitions: - newName = propertyDefinitions[oldName] - value = getValueOrNull(child.attrib, oldName) - if(value is not None): - newAnnotationsNode.attrib[newName] = value - if property == "PLASMIDS": - #Is plasmid a link? it is if it's not a parent - isLink = True - for sampleParentIdentifier in sample.getParentSampleIdentifiers(): - if sampleParentIdentifier == linkedSampleIdentifier: - isLink = False - if isLink: #Find parent who owns it - isFound = False - for sampleParentIdentifier in sample.getParentSampleIdentifiers(): - parentFromSample = getSampleFromCache(sampleParentIdentifier) #tr.getSample(sampleParentIdentifier) - parentAnnotations = None - if parentFromSample != None: - parentAnnotations = parentFromSample.getPropertyValue("ANNOTATIONS_STATE") - if parentAnnotations != None: - if (permId in parentAnnotations): - newAnnotationsNode.attrib["CONTAINED"] = sampleParentIdentifier - isFound = True - else: - print "[WARNING - PARENTANNOTATIONS NONE] " + sample.code + " " + permId - if not isFound: - print "[ERROR - NOTFOUND CONTAINER] " + sample.code + " " + permId - - except Exception, e: - print "[ERROR - PROCESSING PERM_ID] " + sample.code + " " + permId + str(e) - save(tr, sample, "ANNOTATIONS_STATE", ET.tostring(newAnnotationsRoot, encoding='utf-8')) - -def save(tr, sample, property, propertyValue): - mutableSample = tr.makeSampleMutable(sample) - mutableSample.setPropertyValue(property, propertyValue) - -def getValueOrNull(map, key): - if key in map: - return map[key] - else: - return None \ No newline at end of file diff --git a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/plugin.properties b/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/plugin.properties deleted file mode 100644 index b98adb60611c0d4b6aa5b533a500ab5bd3465824..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/stellingmigration/1/dss/drop-boxes/stellingmigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = stellingmigration -incoming-dir = ${root-dir}/stellingmigration \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/as/definitions.py b/plasmid/source/core-plugins/weismigration/1/as/definitions.py deleted file mode 100644 index 409687f79602319d1fa048823be15d14f6c1690f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/as/definitions.py +++ /dev/null @@ -1,239 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Documentation -## -## Properties starting by "+" will be created in openBIS, but will not be read from FileMaker but if set programmatically will be put back in openBIS. -## Properties starting by "-" will not be created in openBIS but will be read from FileMaker. - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -gcScriptName= "GC" -atScriptName= "AT" -lengthScriptName= "SEQUENCE_LENGTH" -annotationsScriptName="ANNOTATIONS" -antibodyrefnumScriptName="ANTIBODY_REFNUM" -antibodynameScriptName="ANTIBODY_NAME" -chemicalrefnumScriptName="CHEMICAL_REFNUM" -oligonameScriptName="OLIGO_NAME" -oligorefnumScriptName="OLIGO_REFNUM" -oligosysnameScriptName = "SYS_NAME" -plasmidnameScriptName="PLASMID_NAME" -plasmidrefnumScriptName="PLASMID_REFNUM" -strainnameScriptName="STRAIN_NAME" -strainglycerolScriptName="STRAIN_GLYCEROL_STOCK_NUM" - - -# -# Experiment Types -# -experimentDefinition = [ - ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "Name", None, None, False], - ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], - ["GRANT", "General", "Grant", DataType.MULTILINE_VARCHAR, None, "grant name", None, None, False], - ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], - ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], - ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] -]; - -# -#Sample Types -# -antibodyDefinition = [ - ["+AB_REF_NUMBER", "General", "RefNumber", DataType.VARCHAR, None, "", None, antibodyrefnumScriptName, False], - ["-REF_NUM", "General", "RefNum", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+AB_NAME", "General", "Antibody Name", DataType.VARCHAR, None, "", None, antibodynameScriptName, False], - ["ANTIGEN", "General", "Antigen", DataType.VARCHAR, None, "", None, None, False], - ["MONO_POLY", "General", "MonoPoly", DataType.CONTROLLEDVOCABULARY, "AB_CLONALITY", "", None, None, False], - ["SPECIES", "General", "Species", DataType.CONTROLLEDVOCABULARY, "AB_SPECIES", "", None, None, False], - ["AB_TYPE", "General", "Type", DataType.CONTROLLEDVOCABULARY, "AB_TYPE", "", None, None, False], - ["FORM", "General", "Form", DataType.CONTROLLEDVOCABULARY, "AB_FORM", "", None, None, False], - ["PRIMARY", "General", "Primary", DataType.VARCHAR, None, "", None, None, False], - ["SECONDARY", "General", "Secondary", DataType.VARCHAR, None, "", None, None, False], - ["COUPLED", "General", "Coupled", DataType.VARCHAR, None, "", None, None, False], - ["VENDOR", "General", "Vendor", DataType.VARCHAR, None, "", None, None, False], - ["AB_CATALOG_NUM", "General", "Catalog#", DataType.VARCHAR, None, "", None, None, False], - ["BY", "General", "By", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["REQUEST_DATE", "General", "RequestDate", DataType.TIMESTAMP, None, "", None, None, False], - ["RECEIVE_DATE", "General", "ReceiveDate", DataType.TIMESTAMP, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False], - ["NOTES", "Comments", "Notes", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["WBDIL", "Comments", "WBDil", DataType.VARCHAR, None, "", None, None, False], - ["IFDIL", "Comments", "IFDil", DataType.VARCHAR, None, "", None, None, False], - ["STORAGE_LOCATION", "Storage", "StorageLocation", DataType.CONTROLLEDVOCABULARY, "AB_LOCATION", "", None, None, False], - ["BOX", "Storage", "Box", DataType.VARCHAR, None, "", None, None, False], - ["AB_EMPTY", "Storage", "emtpy?", DataType.BOOLEAN, None, "", None, None, False], - -]; - - -strainDefinition = [ - ["-NAME", "General", "KWY number", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+NAME_STRAIN", "General", "Strain name", DataType.VARCHAR, None, "", None, strainnameScriptName, False], - ["MAT", "General", "MAT", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], - ["+GENOTYPE", "General", "Genotype", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["BASE_STRAIN", "General", "base strain", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+YEAST_BACKGROUND", "General", "yeast background", DataType.CONTROLLEDVOCABULARY, "YEAST_BACKGROUND", "", None, None, False], - ["DERIVED_FROM", "General", "derived from", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "General", "comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["GENOTYPE_CONFIRMATION", "General", "genotype confirmation", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["WHO_ENTERED", "General", "who entered", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["REMOVED", "General", "removed", DataType.BOOLEAN, None, "", None, None, False], - ["+GLYCEROL_STOCK_NUMBER", "General", "Glycerol stock number", DataType.VARCHAR, None, "", None, strainglycerolScriptName, False], - ["DATE_ENTERED", "General", "date entered", DataType.TIMESTAMP, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False] -]; - -strainDefinitionRepetitions = [ - ["-DISRUPTIONS_1", "Genotype", "disruptions[1]", DataType.VARCHAR, None, "", None, None, False], - ["-DISRUPTIONS_2", "Genotype", "disruptions[2]", DataType.VARCHAR, None, "", None, None, False], - ["-DISRUPTIONS_3", "Genotype", "disruptions[3]", DataType.VARCHAR, None, "", None, None, False], - ["-DISRUPTIONS_4", "Genotype", "disruptions[4]", DataType.VARCHAR, None, "", None, None, False], - ["-DISRUPTIONS_5", "Genotype", "disruptions[5]", DataType.VARCHAR, None, "", None, None, False], - ["-MARKERS_1", "Genotype", "markers[1]", DataType.VARCHAR, None, "", None, None, False], - ["-MARKERS_2", "Genotype", "markers[2]", DataType.VARCHAR, None, "", None, None, False], - ["-MARKERS_3", "Genotype", "markers[3]", DataType.VARCHAR, None, "", None, None, False], - ["-MARKERS_4", "Genotype", "markers[4]", DataType.VARCHAR, None, "", None, None, False], - ["-MARKERS_5", "Genotype", "markers[5]", DataType.VARCHAR, None, "", None, None, False], - ["-UNMARKED_MUTATIONS_1", "Genotype", "\"unmarked mutations\"[1]", DataType.VARCHAR, None, "", None, None, False], - ["-UNMARKED_MUTATIONS_2", "Genotype", "\"unmarked mutations\"[2]", DataType.VARCHAR, None, "", None, None, False], - ["-UNMARKED_MUTATIONS_3", "Genotype", "\"unmarked mutations\"[3]", DataType.VARCHAR, None, "", None, None, False], - ["-UNMARKED_MUTATIONS_4", "Genotype", "\"unmarked mutations\"[4]", DataType.VARCHAR, None, "", None, None, False], - ["-UNMARKED_MUTATIONS_5", "Genotype", "\"unmarked mutations\"[5]", DataType.VARCHAR, None, "", None, None, False] -]; - -oligoDefinition = [ - ["-NAME", "Storage", "UC Number", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, oligonameScriptName, False], - ["+OLIGO_REF_NUM", "General", "RefNum", DataType.VARCHAR, None, "", None, oligorefnumScriptName, False], - ["SEQUENCE", "General", "Sequence", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["LENGTH", "General", "Length", DataType.INTEGER, None, "", None, lengthScriptName, False], - ["GROUP", "General", "Group", DataType.VARCHAR, None, "", None, None, False], - ["SENSE", "General", "Sense", DataType.CONTROLLEDVOCABULARY, "OLIGO_SENSE", "", None, None, False], - ["CATEGORY", "General", "category", DataType.CONTROLLEDVOCABULARY, "OLIGO_CATEGORY", "", None, None, False], - ["NOTES", "General", "Notes", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["REORDERED", "General", "Reordered", DataType.VARCHAR, None, "", None, None, False], - ["LABELS", "General", "Labels", DataType.VARCHAR, None, "", None, None, False], - ["BY", "General", "By", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False], - ["+XMLCOMMENTS", "Comments", "Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False], - ["+SYS_NAME", "Information", "SysName", DataType.VARCHAR, None, "", None, oligosysnameScriptName, False], - ["OLIGO_TYPE", "Information", "Type", DataType.VARCHAR, None, "", None, None, False], - ["STANDARD_TM", "Information", "StandardTm", DataType.REAL, None, "", None, None, False], - ["AT", "Information", "AT%", DataType.INTEGER, None, "", None , atScriptName, False], - ["GC", "Information", "GC%", DataType.INTEGER, None, "", None, gcScriptName, False], - ["MMEXTCOEFF", "Information", "mMExtCoeff", DataType.REAL, None, "", None, None, False], - ["MOLWEIGHT", "Information", "MolWeight", DataType.REAL, None, "", None, None, False], - ["OD", "Information", "OD", DataType.REAL, None, "", None, None, False], - ["REQUEST_DATE", "Information", "RequestDate", DataType.TIMESTAMP, None, "", None, None, False], - ["RECEIVE_DATE", "Information", "ReceiveDate", DataType.TIMESTAMP, None, "", None, None, False], - ["FROM_NUC", "Information", "fromNuc", DataType.INTEGER, None, "", None, None, False], - ["TONUC", "Information", "toNuc", DataType.INTEGER, None, "", None, None, False], - ["LIST", "Information", "List", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_LOCATION", "Information", "Location", DataType.VARCHAR, None, "", None, None, False], - ["PMOL_UL", "Information", "pMol_ul", DataType.REAL, None, "", None, None, False], - ["UG_UL", "Information", "ug_ul", DataType.REAL, None, "", None, None, False], - ["VOLUME", "Information", "Volume", DataType.REAL, None, "", None, None, False], -]; - -plasmidDefinition = [ - ["-NAME", "General", "pKW Number", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+PL_NAME", "General", "pKW Number Calculated", DataType.VARCHAR, None, "", None, plasmidnameScriptName, False], - ["PLASMID_NAME", "General", "Plasmid name", DataType.VARCHAR, None, "", None, None, False], - ["BACTERIAL_STRAIN", "General", "Bacterial strain", DataType.CONTROLLEDVOCABULARY, "PLASMID_BACTERIAL_STRAIN", "", None, None, False], - ["BY", "General", "By", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["NOTEBOOK_REF", "General", "Note Book ref.", DataType.VARCHAR, None, "", None, None, False], - ["REFERENCE", "General", "Reference", DataType.VARCHAR, None, "", None, None, False], - ["VECTOR", "General", "Vector", DataType.VARCHAR, None, "", None, None, False], - ["GENE", "General", "Gene", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION_MARKER", "General", "Selection marker", DataType.CONTROLLEDVOCABULARY, "PLASMID_SELECTION_MAKER", "", None, None, False], - ["DRUG_RES", "General", "Drug res.", DataType.CONTROLLEDVOCABULARY, "PLASMID_DRUG_RES", "", None, None, False], - ["SIZE", "General", "Size", DataType.REAL, None, "", None, None, False], - ["CONCENTRATION", "General", "Concentration", DataType.REAL, None, "", None, None, False], - ["DNA_PREPARED_ON", "General", "DNA prepared on", DataType.VARCHAR, None, "", None, None, False], - ["VECTOR_TYPE", "General", "Vector Type", DataType.CONTROLLEDVOCABULARY, "PLASMID_VECTOR_TYPE", "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False], - ["COMMENT", "Comments", "Comment", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["PARENT_PLASMID", "Cloning Information", "Parent plasmid", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_PARENT", "Cloning Information", "Size parent", DataType.REAL, None, "", None, None, False], - ["5END", "Cloning Information", "5' end", DataType.VARCHAR, None, "", None, None, False], - ["3END", "Cloning Information", "3' end", DataType.VARCHAR, None, "", None, None, False], - ["5MOD", "Cloning Information", "5' Modif.", DataType.VARCHAR, None, "", None, None, False], - ["3MOD", "Cloning Information", "3' Modif.", DataType.VARCHAR, None, "", None, None, False], - ["INSERT", "Cloning Information", "Insert", DataType.VARCHAR, None, "", None, None, False], - ["INSERT_SIZE", "Cloning Information", "Insert size", DataType.REAL, None, "", None, None, False], - ["5INSERT_MOD", "Cloning Information", "5' insert modif.", DataType.VARCHAR, None, "", None, None, False], - ["3INSERT_MOD", "Cloning Information", "3' insert modif.", DataType.VARCHAR, None, "", None, None, False], - ["5END_MOD", "Cloning Information", "5' end insert", DataType.VARCHAR, None, "", None, None, False], - ["3END_INSERT", "Cloning Information", "3' end insert", DataType.VARCHAR, None, "", None, None, False], - ["PCR_3_OLIGO", "Cloning Information", "PCR 3' oligo", DataType.VARCHAR, None, "", None, None, False], - ["PCR_5_OLIGO", "Cloning Information", "PCR 5' oligo", DataType.VARCHAR, None, "", None, None, False], - ["MUTAGENIC_OLIGO", "Cloning Information", "Mutagenic oligo", DataType.VARCHAR, None, "", None, None, False], - ["-REF_NUM", "Storage", "Ref. N.", DataType.INTEGER, None, "", None, None, False], - ["+PL_REF_NUM", "Storage", "Ref. N.", DataType.INTEGER, None, "", None, plasmidrefnumScriptName, False], - ["MUTATION", "General", "Mutation", DataType.VARCHAR, None, "", None, None, False], - ]; - -chemicalDefinition = [ - ["NAME", "General", "Chemical", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["-ID", "General", "#", DataType.VARCHAR, None, "", None, None, False], - ["+CHEM_ID", "General", "#", DataType.VARCHAR, None, "", None, chemicalrefnumScriptName, False], - ["COMPANY", "General", "Company", DataType.VARCHAR, None, "", None, None, False], - ["DISSOLVED_IN", "General", "dissolved in", DataType.VARCHAR, None, "", None, None, False], - ["USED_FOR", "General", "Used for", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["CHEM_EMPTY", "General", "empty?", DataType.BOOLEAN, None, "", None, None, False], - ["DATE_ORDERED", "General", "date ordered", DataType.VARCHAR, None, "", None, None, False], - ["LOT_NUM", "General", "Lot #", DataType.VARCHAR, None, "", None, None, False], - ["CHEM_CATALOG_NUM", "General", "Catalog #", DataType.VARCHAR, None, "", None, None, False], - ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.VARCHAR, None, "", None, None, False], - ["USED_BY", "General", "used by", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "", None, None, False], - ["CHEMICAL_LOCATION", "Storage", "Location", DataType.CONTROLLEDVOCABULARY, "CHEMICALS_LOCATION", "", None, None, False], - ["COMMENTS", "Comments", "Comments", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False] -]; - -RestrictionEnzymeDefinition = [ - ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["COMMENT", "Comments", "Comment", DataType.MULTILINE_VARCHAR, None, "", None, None, False], - ["+ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False], - ["BLOCK", "Storage", "Block", DataType.VARCHAR, None, "", None, None, False], - ["POSITION", "Storage", "Position", DataType.VARCHAR, None, "", None, None, False] -]; - -ExperimentalStepDefinition= [ - ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None,"Name", None, None, False], - ["OWNER", "General", "Owner", DataType.CONTROLLEDVOCABULARY, "LAB_MEMBERS", "Who produced/owned the sample", None, None, False], - ["EXPERIMENTAL_GOALS", "General", "Experimental Goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], - ["EXPERIMENTAL_RESULTS", "General", "Experimental Results", DataType.MULTILINE_VARCHAR, None,"Brief summary of the results obtained", None, None, False], - ["START_DATE", "General", "Start date", DataType.TIMESTAMP, None,"Date when the experimental step is started", None, None, False], - ["END_DATE", "General", "End date", DataType.TIMESTAMP, None, "Date when the experimental step is completed", None, None, False], - ["EXPERIMENTAL_READOUT", "Readout details", "Experimental readout", DataType.CONTROLLEDVOCABULARY, "EXPERIMENTAL_READOUT", "Experimental readout used in the experiment", None, None, False], - ["MACHINE", "Readout details", "Machine", DataType.CONTROLLEDVOCABULARY, "MACHINE","Machine used to perform the experiment", None, None, False], - ["FREEFORM_TABLE_STATE", "Readout details", "Freeform Table State", DataType.MULTILINE_VARCHAR, None, "Table describing how the order of samples measured in the experiments", None, None, False], - ["PUBLICATION", "Comments", "Publication", DataType.MULTILINE_VARCHAR, None, "Publication from where the information was first found OR technical sheet given by the manufacturer", None, None, False], - ["NOTES", "Comments", "Notes", DataType.MULTILINE_VARCHAR, None,"Notes", None, None, False], - ["XMLCOMMENTS", "Comments", "Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False], - ["ANNOTATIONS_STATE", "Comments", "Annotations State", DataType.XML, None, "Annotations State", annotationsScriptName, None, False] -]; - -DefaultDatasetDefinition=[ - ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "Name", None, None,False], - ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None,False] - ] diff --git a/plasmid/source/core-plugins/weismigration/1/as/definitionsVoc.py b/plasmid/source/core-plugins/weismigration/1/as/definitionsVoc.py deleted file mode 100644 index d320499d505ae025593a585faf72f1b8a94573c3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/as/definitionsVoc.py +++ /dev/null @@ -1,296 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "LAB_MEMBERS" : [ - ["ELISA_DULTZ", "E. Dultz"], - ["A_KOEK", "A. Koek"], - ["A_MADRID", "A. Madrid"], - ["AC_STROM", "A.C. Strom"], - ["A_HIBBEL", "A. Hibbel"], - ["B_ZEITLER", "B. Zeitler"], - ["B_MONTPETIT", "B. Montpetit"], - ["C_BRUNE", "C. Brune"], - ["C_DERRER", "C. Derrer"], - ["C_SMOLKE", "C. Smolke"], - ["C_WEIRICH", "C. Weirich"], - ["C_MUGLER", "C. Mugler"], - ["E_GREEN", "E. Green"], - ["E_ONISHCHENKO", "E. Onishchenko"], - ["E_WEIDER", "E. Weider"], - ["J_CARROLL", "J. Carroll"], - ["J_TANG", "J. Tang"], - ["J_SODERHOLM", "Jon Soderholm"], - ["K_WEIS", "K. Weis"], - ["L_STANTON", "L. Stanton"], - ["M_BLOWER", "M. Blower"], - ["M_HERZOG", "M. Herzog"], - ["M_HOCHSTRASSER", "M. Hochstrasser"], - ["M_HONDELE", "M. Hondele"], - ["M_NACHURY", "M. Nachury"], - ["N_FISCHER", "N. Fischer"], - ["L_CHAN", "L. Chan"], - ["P_KALAB", "P. Kalab"], - ["R_JOYNER", "R. Joyner"], - ["R_SACHDEV", "R. Sachdev"], - ["R_MANCINI", "R. Mancini"], - ["S_MUNCHEL", "S. Munchel"], - ["N_TAKIZAWA", "N. Takizawa"], - ["S_BIRD", "S. Bird"], - ["S_HEINRICH", "S. Heinrich"], - ["S_RAJOO", "S. Rajoo"], - ["Y_JIANG", "Y. Jiang"], - ["Z_DOSSANI", "Z. Dossani"], - ["B_ROBINSON", "B. Robison"], - ["C_MCGOURTY", "C. McGourty"], - ["SEE_COMMENTS", "See comments"], - - ], - "AB_CLONALITY" : [ - ["MONOCLONAL", "monoclonal"], - ["POLYCLONAL", "polyclonal"], - ], - "AB_SPECIES" : [ - ["HUMAN", "Human"], - ["RABBIT", "Rabbit"], - ["MOUSE", "Mouse"], - ["CHICKEN", "Chicken"], - ["DONKEY", "Donkey"], - ["CAMEL", "Camel"], - ["GOAT", "Goat"], - ["SHEEP", "Sheep"], - ["RAT", "Rat"], - ["UNKWOWN", "?"], - ["SEE_COMMENTS", "see comments"], - - ], - "AB_TYPE" : [ - ["IGG", "IgG"], - ["IGM", "IgM"], - ["IGY", "IgY"], - ["UNKNOWN", "?"], - ["SEE_COMMENTS", "see comments"], - - ], - "AB_FORM" : [ - ["SERUM", "serum"], - ["AFFINITY_PURIFIED", "affinity purified"], - ["TISSUE_CULT_SUPERNATANT", "tissue culture supernatant"], - ["SEE_COMMENTS", "see comments"], - - ], - "AB_PRIMSEC" : [ - ["PRIMARY", "primary"], - ["SECONDAY", "secondary"], - - ], - "AB_LOCATION" : [ - ["FOUR_DEG", "4C"], - ["MINUS_20", "-20C"], - ["MINUS_80", "-80C"], - ["RT", "RT"], - ["SEE_COMMENTS", "see comments"], - ], - "CHEMICALS_LOCATION" : [ - ["CHEM_CABINET", "Chemical cabinet"], - ["CHEM_CABINET_E8", "Chemical cabinet E8"], - ["MINUS_20", "-20C"], - ["FOUR_DEG", "4C"], - ["MINUS_80", "-80C"], - ["SMALL_CHEMICALS", "Small chemicals"], - ["DYES", "Dyes"], - ["SEE_COMMENTS", "see comments"], - - ], - "YEAST_BACKGROUND" : [ - ["UNKWNOWN", "?"] - - ], - - "OLIGO_CATEGORY" : [ - ["CHECKING", "Checking"], - ["CLONING", "Cloning"], - ["MUTAGENESIS", "Mutagenesis"], - ["PRINGLE", "Pringle"], - ["QPCR", "qPCR"], - ["SEQUENCING", "qPCR"], - ], - "OLIGO_SENSE" : [ - ["SENSE", "sense"], - ["ANTISENSE", "antisense"], - ], - "PLASMID_BACTERIAL_STRAIN" : [ - ["XL1BLUE", "XL1blue"], - ["XL10-GOLD", "XL10-Gold"], - ["XL1-BLUE", "XL1-Blue"], - ["TG2", "TG2"], - ["TG1", "TG1"], - ["SURE", "SURE"], - ["STBL3", "STBL3"], - ["STBL2", "STBL2"], - ["SOLR_CELLS", "SOLR cells"], - ["SG13", "SG13"], - ["SCS110", "SCS110"], - ["MC1061", "MC1061"], - ["MACH1", "MACH1"], - ["M15PREP4", "M15prep4"], - ["KC8", "KC8"], - ["HB101", "HB101"], - ["E_COLI", "E.coli"], - ["DH5ALPHA", "DH5alpha"], - ["DH10B", "DH10B"], - ["DH1", "DH1"], - ["CCDB_SURVIVAL", "ccdB Survival"], - ["BLR", "BLR"], - ["BL21_PLUS", "BL21+"], - ["BL21-LYSS", "BL21[LysS]"], - ["BL21", "BL21"], - ["UNKNOWN", "???"] - ], - "PLASMID_DRUG_RES" : [ - ["AMP", "Amp"], - ["AMP_MAYBE", "AMP?"], - ["CAM", "CAM"], - ["KAN", "KAN"], - ["KAN_CAM", "kan cam"], - ["KAN-CAM-CCDB_CELLS", "KAN,CAM, ccdB cells"], - ["TET", "tet"], - ["ZEO", "Zeo"] - ], - - "PLASMID_SELECTION_MAKER" : [ - ["URA3_ADE3", "URA3, ADE3"], - ["ADE2", "ADE2"], - ["CAURA", "CaURA"], - ["CAURA3", "CaURA3"], - ["CEN_HIS3", "CEN, HIS3"], - ["G418", "G418"], - ["HIS3", "HIS3"], - ["HIS3_OR_LEU2", "HIS3 or LEU2"], - ["HIS3MX", "HIS3MX"], - ["HIS5", "HIS5"], - ["HIS5MX", "His5MX"], - ["HISMX", "HisMX"], - ["HISMX6", "HISMX6"], - ["HPHMX", "HphMx"], - ["HYG", "Hyg"], - ["HYGB", "HYGB"], - ["HYGB_R", "HygB R"], - ["KAN", "kan"], - ["KANMX", "KanMX"], - ["LEU", "Leu"], - ["LEU2", "LEU2"], - ["MET15", "MET15"], - ["NAT", "Nat"], - ["NATMX", "NatMX"], - ["NEO", "Neo"], - ["NOTHING", "nothing"], - ["S_POMBE_HIS5", "S. pombe His5"], - ["SPHIS5", "SpHIS5"], - ["TRP1", "TRP1"], - ["URA", "URA"], - ["URA3", "URA3"], - ["URA3_CA", "URA3 (C.a.)"] - ], - "PLASMID_VECTOR_TYPE" : [ - ["BACTERIAL_EXPRESSION", "Bacterial expression"], - ["YEAST_INTEGRATION", "Yeast integration"], - ["PRINGLE", "Pringle"], - ["MAMMALIAN_EXPRESSION", "Mammalian expression"], - ["YEAST_CEN", "Yeast CEN"], - ["YEAST_CENLESS", "Yeast CEN-less with ARS"], - ["YEAST_2U", "Yeast 2u"], - ["CLONING_INTERMEDIATE", "Cloning intermediate"], - ["PLASMID", "Plasmid"], - ["PHAGEMID", "Phagemid"] - - ], - "EXPERIMENTAL_READOUT": - [ - ["FLOW_CYTOMETRY", "flow citometry", None], - ["SORTING", "cell sorting", None], - ["GROWTH", "growth", None], - ["WESTERN_BLOTTING", "western blotting", None], - ["RT_QPCR", "RT-qPCR", None] - ], - "MACHINE": - [ - ["LSRII_FORTESSA", "SRII Fortessa", None], - ["TECAN_READER", "Tecan reader", None], - ["BIOLECTOR", "BioLector", None], - ["LICOR_ODYSSEY", "LI-COR Odyssey", None], - ["TI_ECLIPSE", "TI Eclipse (Nikon)", None], - ["SRX_101A", "Konica Minolta SRX-101A", None], - ["LIGHT_CYCLER", "LightCycler 480", None] - ], - "FREEZER" : [ - ["BENCH-20", "Bench -20�C"], - ["BENCH-80", "Bench -80�C"], - ["BENCH-RT", "Bench RT"], - ["BENCH", "Bench"] - ], - "MAT" : [ - ["ALPHA", "a"], - ["A", "A"], - ["ALPHA_A", "a/A"], - ["A_A", "A/A"], - ["ALPHA_ALPHA", "a/a"], - ["UNKNOWN", "?"], - ] - - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/as/initialize-master-data.py b/plasmid/source/core-plugins/weismigration/1/as/initialize-master-data.py deleted file mode 100644 index 2f15877fe4c9e3314fb40a5197c05ab420084df1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/as/initialize-master-data.py +++ /dev/null @@ -1,327 +0,0 @@ -# -# Copyright 2014 ETH Zuerich, Scientific IT Services -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -## -## Configuration -## -#PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/juanf/Documents/workspace/openbis/source/core-plugins/petermigration/1/compatibility/"; -PATH_TO_MANAGE_PROPERTIES_SCRIPTS = "/Users/barillac/openbis-weis/servers/core-plugins/weismigration/1/compatibility/"; - -# MasterDataRegistrationTransaction Class -import definitions -import definitionsVoc -import os -import copy -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -## -## Globals -## -vocabulariesCache = {}; -propertiesCache = {}; -samplesCache = {}; -tr = service.transaction() - -## -## API Facade -## -def createVocabularyWithTerms(vocabularyCode, terms): - vocabulary = tr.createNewVocabulary(vocabularyCode); - vocabulary.setChosenFromList(True); - addTerms(vocabulary, terms); - vocabulariesCache[vocabularyCode] = vocabulary; - -def addTerms(vocabulary, terms): - for term in terms: - addTermWithLabel(vocabulary, term[0], term[1]) - -def addTermWithLabel(vocabulary, termCode, termLabel): - newTerm = tr.createNewVocabularyTerm(termCode); - newTerm.setLabel(termLabel); - vocabulary.addTerm(newTerm); - -def createSampleTypeWithProperties(sampleTypeCode, description, properties): - newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); - newSampleType.setDescription(description); - newSampleType.setShowParents(True); - newSampleType.setAutoGeneratedCode(True); - if sampleTypeCode == "CHEMICAL": - newSampleType.setGeneratedCodePrefix("CHEM"); - elif sampleTypeCode == "RESTRICTION_ENZYME": - newSampleType.setGeneratedCodePrefix("RE"); - elif sampleTypeCode == "ANTIBODY": - newSampleType.setGeneratedCodePrefix("AB"); - elif sampleTypeCode == "OLIGO": - newSampleType.setGeneratedCodePrefix("CH"); - elif sampleTypeCode == "PLASMID": - newSampleType.setGeneratedCodePrefix("PKW"); - elif sampleTypeCode == "STRAIN": - newSampleType.setGeneratedCodePrefix("KWY"); - elif sampleTypeCode == "EXPERIMENTAL_STEP": - newSampleType.setGeneratedCodePrefix("EXP"); - addProperties(newSampleType, properties); - samplesCache[sampleTypeCode] = newSampleType; - -def createDataSetTypeWithProperties(dataSetCode, description, properties): - newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); - newDataSet.setDescription(description); - addProperties(newDataSet, properties); - -def createExperimentTypeWithProperties(experimentTypeCode, description, properties): - newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); - newExperiment.setDescription(description); - addProperties(newExperiment, properties); - -def addPropertiesToSamples(sampleTypeCodes, properties): - for sampleTypeCode in sampleTypeCodes: - sampleType = samplesCache[sampleTypeCode]; - addProperties(sampleType, properties); - -def addProperties(entity, properties): - for property in properties: - propertyCode = property[0]; - if propertyCode.startswith("-"): - continue - elif propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - - addProperty(entity, propertyCode, property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8]); - -def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory): - property = None; - - if propertyCode in propertiesCache: - property = propertiesCache[propertyCode]; - else: - property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); - - propertyAssignment = tr.assignPropertyType(entity, property); - propertyAssignment.setSection(section); - propertyAssignment.setMandatory(isMandatory); - propertyAssignment.setShownEdit(True); - - if managedScript != None: - propertyAssignment.setManaged(True); - propertyAssignment.setScriptName(managedScript); - if dynamicScript != None: - propertyAssignment.setDynamic(True); - propertyAssignment.setShownEdit(False); - propertyAssignment.setScriptName(dynamicScript); - -def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): - property = tr.getOrCreateNewPropertyType(propertyCode, dataType); - property.setDescription(propertyDescription); - property.setLabel(propertyLabel); - propertiesCache[propertyCode] = property; - if dataType == DataType.CONTROLLEDVOCABULARY: - property.setVocabulary(vocabulariesCache[vocabularyCode]); - return property; - -#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION -def createScript(path, name, description, scriptType, entityType): - scriptAsString = open(path, 'r').read(); - script = tr.getOrCreateNewScript(name); - script.setName(name); - script.setDescription(description); - script.setScript(scriptAsString); - script.setScriptType(scriptType); - script.setEntityForScript(entityType); - return script; - - -def createAnnotationsScriptForType(sampleTypeCode): - annotationsScriptName = None; - if PATH_TO_MANAGE_PROPERTIES_SCRIPTS != None: - annotationsScriptName = "ANNOTATIONS_" + sampleTypeCode; - annotationsScriptAsString = open(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "managed.py", 'r').read(); - annotationsScriptAsString = annotationsScriptAsString.replace("<REPLACE_WITH_ANNOTABLE_TYPE>", sampleTypeCode); - annotationsScript = tr.getOrCreateNewScript(annotationsScriptName); - annotationsScript.setName(annotationsScriptName); - annotationsScript.setDescription("Annotations Handler for " + sampleTypeCode); - annotationsScript.setScript(annotationsScriptAsString); - annotationsScript.setScriptType("MANAGED_PROPERTY"); - annotationsScript.setEntityForScript("SAMPLE"); - return annotationsScriptName; -## -## Managed properties scripts -## -commentsScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "comments.py", - definitions.commentsScriptName, - "Comments Handler", - "MANAGED_PROPERTY", - "SAMPLE"); - -## -## Dynamic properties scripts -## - - - - -gcScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "gc.py", - definitions.gcScriptName, - "Count percentage of G and C in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - -atScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "at.py", - definitions.atScriptName, - "Count percentage of A and T in sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - -lengthScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "length.py", - definitions.lengthScriptName, - "Count length sequence", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - -antibodyrefnumScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "antibody_refnum.py", - definitions.antibodyrefnumScriptName, - "Antibody ref num from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); -antibodynameScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "antibody_name.py", - definitions.antibodynameScriptName, - "Antibody name from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -chemicalrefnumScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "chemical_refnum.py", - definitions.chemicalrefnumScriptName, - "Chemical ref num from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -oligonameScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "oligo_name.py", - definitions.oligonameScriptName, - "Oligo name from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -oligorefnumScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "oligo_refnum.py", - definitions.oligorefnumScriptName, - "Oligo ref num from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -oligosysnameScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "sysname_calculation.py", - definitions.oligosysnameScriptName, - "Oligo sys name calculation", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -plasmidnameScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "plasmid_name.py", - definitions.plasmidnameScriptName, - "Plasmid name from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -plasmidrefnumScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "plasmid_refnum.py", - definitions.plasmidrefnumScriptName, - "Plasmid ref num from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -strainnameScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "strain_name.py", - definitions.strainnameScriptName, - "Strain name from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - -strainglycerolScriptName = createScript(PATH_TO_MANAGE_PROPERTIES_SCRIPTS + "strain_glycerol_stock_number.py", - definitions.strainglycerolScriptName, - "Strain glycerol stock number from code", - "DYNAMIC_PROPERTY", - "SAMPLE"); - - - - - - -## -## Vocabulary Types -## -for vocabularyCode, vocabularyValues in definitionsVoc.vocabularyDefinitions.iteritems(): - createVocabularyWithTerms(vocabularyCode, vocabularyValues) - -## -## DataSet Types -## -createDataSetTypeWithProperties("ELN_PREVIEW", "ELN Preview image", definitions.DefaultDatasetDefinition); -createDataSetTypeWithProperties("SEQ_FILE", "",definitions.DefaultDatasetDefinition); -createDataSetTypeWithProperties("RAW_DATA", "",definitions.DefaultDatasetDefinition); -createDataSetTypeWithProperties("ANALYZED_DATA", "", definitions.DefaultDatasetDefinition); - #=============================================================================================== - # createDataSetTypeWithProperties("SEQ_FILE", "", [ - # ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "Name", None, None,False], - # ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - # ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None,False] - # - # ]); - # - # createDataSetTypeWithProperties("RAW_DATA", "", [ - # ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "Name", None, None,False], - # ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - # ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None,False] - # ]); - # - # createDataSetTypeWithProperties("ANALYZED_DATA", "", [ - # ["NAME", "General", "Name", DataType.MULTILINE_VARCHAR, None, "Name", None, None,False], - # ["NOTES", "General information", "Notes", DataType.MULTILINE_VARCHAR, None, "Notes regarding the dataset", None, None,False], - # ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None,False] - # ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] - # ]); - # - #=============================================================================================== - - -## -## Experiment Types -## -createExperimentTypeWithProperties("DEFAULT_EXPERIMENT", "Default Experiment", definitions.experimentDefinition); -createExperimentTypeWithProperties("MATERIAL", "FOLDER FOR ORGANIZING MATERIALS SAMPLES", []); -createExperimentTypeWithProperties("METHOD", "FOLDER FOR ORGANIZING METHODS SAMPLES", []); - - -## -## Sample Types -## -annotationsScriptName = createAnnotationsScriptForType("ANTIBODY"); -createSampleTypeWithProperties("ANTIBODY", "", definitions.antibodyDefinition); -#addStorageGroups(definitions.numberOfStorageGroups, "ANTIBODY"); -annotationsScriptName = createAnnotationsScriptForType("STRAIN"); -createSampleTypeWithProperties("STRAIN", "", definitions.strainDefinition); -# addRepetition(definitions.numberOfRepetitions, "STRAIN"); -annotationsScriptName = createAnnotationsScriptForType("PLASMID"); -createSampleTypeWithProperties("PLASMID", "", definitions.plasmidDefinition); -# addStorageGroups(definitions.numberOfStorageGroups, "PLASMID"); -annotationsScriptName = createAnnotationsScriptForType("OLIGO"); -createSampleTypeWithProperties("OLIGO", "", definitions.oligoDefinition); -annotationsScriptName = createAnnotationsScriptForType("CHEMICAL"); -createSampleTypeWithProperties("CHEMICAL", "", definitions.chemicalDefinition); -annotationsScriptName = createAnnotationsScriptForType("RESTRICTION_ENZYME"); -createSampleTypeWithProperties("RESTRICTION_ENZYME", "", definitions.RestrictionEnzymeDefinition); -annotationsScriptName = createAnnotationsScriptForType("EXPERIMENTAL_STEP"); -createSampleTypeWithProperties("EXPERIMENTAL_STEP", "", definitions.ExperimentalStepDefinition); - - - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/adenosine_count.py b/plasmid/source/core-plugins/weismigration/1/compatibility/adenosine_count.py deleted file mode 100644 index 58363afbe1c2b60133113de10b140a4ace143e99..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/adenosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('A')+entity.propertyValue('SEQUENCE').count('a') \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_name.py b/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_name.py deleted file mode 100644 index 137e26f9b9adeee242f5107ad5c8976b0f321dd5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_name.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - code= entity.entityPE().code - - return code \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_refnum.py b/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_refnum.py deleted file mode 100644 index 4a88e4102d91019583d397c0b375830e1c357c27..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/antibody_refnum.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - codeNum= entity.entityPE().code.split('AB') - - return codeNum[1] diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/at.py b/plasmid/source/core-plugins/weismigration/1/compatibility/at.py deleted file mode 100644 index 60aa3b66afe2b4db3f9b956737df7f788bc53050..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/at.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = (len(re.findall("A|a|T|t", entity.propertyValue('SEQUENCE'))) * 100)/len(re.findall("A|a|C|c|G|g|T|t|U|u", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/chemical_refnum.py b/plasmid/source/core-plugins/weismigration/1/compatibility/chemical_refnum.py deleted file mode 100644 index c45f80adea4ba2686f0335ac9ff4a26757bc6922..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/chemical_refnum.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - codeNum= entity.entityPE().code.split('CHEM') - - return codeNum[1] diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/comments.py b/plasmid/source/core-plugins/weismigration/1/compatibility/comments.py deleted file mode 100644 index 02c50d2364afd8bf0dce2d50297c6bff2ccb35bf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/comments.py +++ /dev/null @@ -1,174 +0,0 @@ -from java.util import Date - -""" -Example XML property value handled by this script: -<root> - <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st entry text.<commentEntry> - <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd entry text - a warning!<commentEntry> - <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th entry text - an error!!!<commentEntry> - <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th entry text - a warning!<commentEntry> -</root> -""" - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' - -""" labels of table columns and corresponding input fields """ -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -""" names of attributes of XML elements for comment entries """ -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' - -""" action labels (shown as button labels in UI) """ -ADD_ACTION_LABEL = 'Add Comment Entry' -EDIT_ACTION_LABEL = 'Edit' -DELETE_ACTION_LABEL = 'Delete' - - -def configureUI(): - """Create table builder and add headers of columns.""" - builder = createTableBuilder() - builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150) - builder.addHeader(PERSON_LABEL) - builder.addHeader(COMMENT_TEXT_LABEL, 400) - - """ - Extract XML elements from property value to a Python list. - For each element (comment entry) add add a row to the table. - """ - elements = list(propertyConverter().convertToElements(property)) - for commentEntry in elements: - row = builder.addRow() - row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE)))) - row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE)) - row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData()) - - """Specify that the property should be shown in a tab and set the table output.""" - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(builder.getTableModel()) - - """ - Define and add actions with input fields used to: - 1. specify attributes of new comment entry, - """ - addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\ - .setDescription('Add a new comment entry:') - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\ - .setMandatory(True) - ] - addAction.addInputWidgets(widgets) - - """ - 2. modify attributes of a selected comment entry, - """ - editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\ - .setDescription('Edit selected comment entry:') - # Exactly 1 row needs to be selected to enable action. - editAction.setRowSelectionRequiredSingle() - widgets = [ - inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True) - ] - editAction.addInputWidgets(widgets) - # Bind field name with column name. - editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL) - - """ - 3. delete selected comment entries. - """ - deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\ - .setDescription('Are you sure you want to delete selected comment entry?') - # Delete is enabled when at least 1 row is selected. - deleteAction.setRowSelectionRequired() - - -def updateFromUI(action): - """Extract list of elements from old value of the property.""" - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - """Implement behaviour of user actions.""" - if action.name == ADD_ACTION_LABEL: - """ - For 'add' action create new comment entry element with values from input fields - and add it to existing elements. - """ - element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - """Fill element attributes with appropriate values.""" - element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime())) # current date - element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action - """Retrieve values from input fields filled by user on the client side.""" - - """Set comment text as a text element, not an attribute.""" - element.setData(action.getInputValue(COMMENT_TEXT_LABEL)) - """Add the new entry to the end of the element list.""" - elements.append(element) - elif action.name == EDIT_ACTION_LABEL: - """ - For 'edit' action find the comment entry element corresponding to selected row - and replace it with an element with values from input fields. - """ - - selectedRowId = action.getSelectedRows()[0] - xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL)) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - elif action.name == DELETE_ACTION_LABEL: - """ - For 'delete' action delete the entries that correspond to selected rows. - NOTE: As many rows can be deleted at once it is easier to delete them in reversed order. - """ - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE) - if action.getPerson().getUserId() == xmlUser: - elements.pop(rowId) - else: - raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) ) - else: - raise ValidationException('action not supported') - - """Update value of the managed property to XML string created from modified list of elements.""" - property.value = converter.convertToString(elements) - -def _createCommentEntry(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId()) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime())) - commentEntry.setData(comment_text_list) - return commentEntry - -def showRawValueInForms(): - return False - -def batchColumnNames(): - return [COMMENT_ENTRY_ELEMENT_LABEL] - -def updateFromRegistrationForm(bindings): - elements = [] - for item in bindings: - comment_text_list = item.get('COMMENTENTRY') - sampleLink = _createCommentEntry(comment_text_list) - elements.append(sampleLink) - - property.value = propertyConverter().convertToString(elements) - - - - -def updateFromBatchInput(bindings): - elements = [] - input = bindings.get('') - if input is not None: - commentEntry = _createCommentEntry(input) - elements.append(commentEntry) - property.value = propertyConverter().convertToString(elements) diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/cytosine_count.py b/plasmid/source/core-plugins/weismigration/1/compatibility/cytosine_count.py deleted file mode 100644 index faed851214f3a13d5fd25c093a6b44b2fa3ea6c0..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/cytosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('C')+entity.propertyValue('SEQUENCE').count('c') \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/gc.py b/plasmid/source/core-plugins/weismigration/1/compatibility/gc.py deleted file mode 100644 index 6e0edde3126b787a16acd8af0bb67184d77f377a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/gc.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = (len(re.findall("G|g|C|c", entity.propertyValue('SEQUENCE'))) * 100)/len(re.findall("A|a|C|c|G|g|T|t|U|u", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/genotype.py b/plasmid/source/core-plugins/weismigration/1/compatibility/genotype.py deleted file mode 100644 index b8e214a367e7132814e0bc91215e450f59ea1cbb..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/genotype.py +++ /dev/null @@ -1,19 +0,0 @@ -def calculateValue(): - mat= entity.propertyValue('MAT')+":" - - result1=entity.propertyValue('DISRUPTIONS_1')+"::" +entity.propertyValue('MARKERS_1')+" " +entity.propertyValue('UNMARKED_MUTATIONS_1') +" " - - result2=entity.propertyValue('DISRUPTIONS_2')+"::" +entity.propertyValue('MARKERS_2')+" " +entity.propertyValue('UNMARKED_MUTATIONS_2') +" " - - result3=entity.propertyValue('DISRUPTIONS_3')+"::" +entity.propertyValue('MARKERS_3')+" " +entity.propertyValue('UNMARKED_MUTATIONS_3') +" " - - result4=entity.propertyValue('DISRUPTIONS_4')+"::" +entity.propertyValue('MARKERS_4')+" " +entity.propertyValue('UNMARKED_MUTATIONS_4') +" " - - result5=entity.propertyValue('DISRUPTIONS_5')+"::" +entity.propertyValue('MARKERS_5')+" " +entity.propertyValue('UNMARKED_MUTATIONS_5') +" " - - - result_tot= mat+result1+result2+result3+result4+result5 - return result_tot - -def calculate(): - return calculateValue() diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/guanosine_count.py b/plasmid/source/core-plugins/weismigration/1/compatibility/guanosine_count.py deleted file mode 100644 index 913b9db58cc74a5804779a4b2d9dcddd5ab12290..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/guanosine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('G')+entity.propertyValue('SEQUENCE').count('g') \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/length.py b/plasmid/source/core-plugins/weismigration/1/compatibility/length.py deleted file mode 100644 index 3566e9b943e0a88502b2fc78e8643f0f25826f58..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/length.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = len(re.findall("A|a|C|c|G|g|T|t|U|u", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/managed.py b/plasmid/source/core-plugins/weismigration/1/compatibility/managed.py deleted file mode 100644 index 6d6312c0f92b6c8bcc7e59032b5bbad4d7005858..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/managed.py +++ /dev/null @@ -1,331 +0,0 @@ -from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider - -## -## Configuration -## - -# This needs to be edited for each sample type to match the Profile.js ANNOTATION_PROPERTIES map. -configuration = {} -configuration["MEDIA"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["SOLUTION_BUFFER"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["GENERAL_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False } - }; - -configuration["PCR_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["WESTERN_BLOTTING_PROTOCOL"] = { - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False } - }; - -configuration["PLASMID"] = { - "PLASMID" : {"COMMENTS" : False } - }; - -configuration["BACTERIA"] = { - "BACTERIA" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["YEAST"] = { - "YEAST" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False, "CONTAINED" : False } - }; - -configuration["CELL_LINE"] = { - "CELL_LINE" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False } - }; - -configuration["FLY"] = { - "FLY" : {"COMMENTS" : False }, - "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False } - }; - -configuration["EXPERIMENTAL_STEP"] = { - "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False }, - "BACTERIA" : {"COMMENTS" : False }, - "CELL_LINE" : {"COMMENTS" : False }, - "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False }, - "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }, - "FLY" : {"COMMENTS" : False }, - "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }, - "OLIGO" : {"COMMENTS" : False }, - "PLASMID" : {"COMMENTS" : False }, - "RNA" : {"COMMENTS" : False }, - "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False }, - "YEAST" : {"COMMENTS" : False }, - "GENERAL_PROTOCOL" : {"COMMENTS" : False }, - "PCR_PROTOCOL" : {"COMMENTS" : False }, - "WESTERN_BLOTTING_PROTOCOL" : {"COMMENTS" : False } - }; - -configurationCopyParents = {} -configurationCopyParents["YEAST"] = { "YEAST" : "PLASMID" }; - -#Global Variables -annotableType = "<REPLACE_WITH_ANNOTABLE_TYPE>" -propertyTypes = None -def getPropertyTypes(): - global propertyTypes - if propertyTypes is None: - server = CommonServiceProvider.getCommonServer() - contextOrNull = server.tryToAuthenticateAsSystem() - propertyTypes = server.listPropertyTypes(contextOrNull.getSessionToken(), False) - return propertyTypes; - -## -## Help Methods -## -def getAllAnnotableSampleTypesForType(fromAnnotableType): - allTypes = {}; - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - allTypes[sampleTypeWithAnnotationsForType] = True; - return allTypes; - -def getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCodeToFind, fromAnnotableType): - for sampleTypeWithAnnotations in configuration: - if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations): - for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]: - if sampleTypeWithAnnotationsForType == sampleTypeCodeToFind: - return configuration[sampleTypeWithAnnotations][sampleTypeWithAnnotationsForType]; - return None; - -def getPropertyType(propertyTypeCode): - for propertyType in getPropertyTypes(): - if propertyType.code == propertyTypeCode: - return propertyType - return None; - -def createAnnotationsFor(identifier, annotations, sampleType): - permId = entityInformationProvider().getSamplePermId(identifier); - newAnnotation = elementFactory().createSampleLink(permId) - - newAnnotation.addAttribute("identifier", identifier) - newAnnotation.addAttribute("sampleType", sampleType) - for annotation in annotations: - newAnnotation.addAttribute(annotation, annotations[annotation]) - return newAnnotation - -def getWidgetForAdd(sampleTypeCode, annotableType): - #print "sampleTypeCode:" + sampleTypeCode + " - " + annotableType #Deleting this comment causes the thing to break - widgets = [] - widgetIdentifier = inputWidgetFactory().createTextInputField("identifier")\ - .setMandatory(True)\ - .setValue("")\ - .setDescription("") - widgets.append(widgetIdentifier) - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - widget = inputWidgetFactory().createTextInputField(propertyType.label)\ - .setMandatory(getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType)[propertyTypeCode])\ - .setValue("")\ - .setDescription(propertyType.description) - widgets.append(widget) - return widgets; - -def isValid(dataType, value): - return True - -## -## Registration form (EXPERIMENTAL) -## - -# def inputWidgets(): -# print "EXECUTING inputWidgets START" -# widgetsToCopyFrom = [] -# if annotableType in configurationCopyParents: -# toCopyFrom = configurationCopyParents[annotableType] -# if(toCopyFrom is not None): -# for key in toCopyFrom: -# widgetLabel = key + " to copy " + toCopyFrom[key] -# print "EXECUTING inputWidgets key: " + widgetLabel -# widgetToCopyFrom = inputWidgetFactory().createTextInputField(widgetLabel).setMandatory(False) -# widgetsToCopyFrom.append(widgetToCopyFrom) -# print "EXECUTING inputWidgets " + str(len(widgetsToCopyFrom)) -# return widgetsToCopyFrom -# -# def updateFromRegistrationForm(bindings): -# print "EXECUTING updateFromaRegistrationForm" -# for key in bindings: -# print "MANAGED WITH KEY: " + str(key) - -## -## Main Methods -## -def configureUI(): - # Add Headers - tableBuilder = createTableBuilder() - tableBuilder.addHeader("identifier") - tableBuilder.addHeader("sampleType") - tableBuilder.addHeader("name") - - usedTableHeaders = {"identifier" : True, "sampleType" : True, "name" : True } - - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - if propertyTypeCode not in usedTableHeaders: - tableBuilder.addHeader(propertyTypeCode) - usedTableHeaders[propertyTypeCode] = True - - property.setOwnTab(True) - uiDescription = property.getUiDescription() - uiDescription.useTableOutput(tableBuilder.getTableModel()) - - # Add Rows - samples = list(propertyConverter().convertToElements(property)) - for sample in samples: - row = tableBuilder.addRow() - permId = sample.getAttribute("permId") - - nameValue = entityInformationProvider().getSamplePropertyValue(permId, "NAME") - if nameValue is not None: - row.setCell("name", nameValue) - - for annotation in sample.getAttributes(): - if annotation != "permId": - if annotation == "identifier": - row.setCell(annotation, sample, sample.getAttribute(annotation)) - else: - row.setCell(annotation, sample.getAttribute(annotation)) - - # Add Create buttons - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - title = "Add " + sampleTypeCode; - addAction = uiDescription.addTableAction(title).setDescription(title) - widgets = getWidgetForAdd(sampleTypeCode, annotableType) - addAction.addInputWidgets(widgets) - - # TO-DO Edit button for each type with different hooks to the columns depending on the type - # Add Edit Button (EXPERIMENTAL) -# editAction = uiDescription.addTableAction('Edit').setDescription('Edit selected table row') -# editAction.setRowSelectionRequiredSingle() -# editWidgets = [] -# for headerKey in usedTableHeaders: -# editWidgets.append(inputWidgetFactory().createTextInputField(headerKey)) -# editAction.addBinding(headerKey, headerKey) -# editAction.addInputWidgets(editWidgets) - - # Add Delete button - deleteAction = uiDescription.addTableAction("Delete")\ - .setDescription('Are you sure you want to delete selected annotation?') - deleteAction.setRowSelectionRequired() # Delete is enabled when at least 1 row is selected. - -def updateFromUI(action): - converter = propertyConverter() - elements = list(converter.convertToElements(property)) - - if action.name.startswith("Add"): - sampleTypeCode = action.name[4:] - identifier = action.getInputValue("identifier") - annotations = { } - for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType): - propertyType = getPropertyType(propertyTypeCode) - propertyTypeValue = action.getInputValue(propertyType.label) - if not isValid(propertyType.dataType, propertyTypeValue): - raise ValidationException("Property " + str(propertyType.label) + " with invalid value " + str(propertyTypeValue)) - if propertyTypeValue is None: - propertyTypeValue = "" - annotations[propertyTypeCode] = propertyTypeValue - newAnnotation = createAnnotationsFor(identifier, annotations, sampleTypeCode) - elements.append(newAnnotation) - - if action.name.startswith("Delete"): - rowIds = list(action.getSelectedRows()) - rowIds.reverse() - for rowId in rowIds: - elements.pop(rowId) - - property.value = converter.convertToString(elements) - -## -## Batch Import Methods -## -def batchColumnNames(): - allTypes = [] - for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType): - allTypes.append(sampleTypeCode) - return allTypes - -def updateFromBatchInput(bindings): - #print "--------> UPDATE FROM BATCH INPUT: " - elements = [] - - #Links Configuration - typesToCopyFrom = [] - if annotableType in configurationCopyParents: - typesToCopyFrom = configurationCopyParents[annotableType] - - for annotableSampleType in getAllAnnotableSampleTypesForType(annotableType): - annotatedSamples = bindings.get(annotableSampleType) - #print "-----> TYPE: " + str(annotableSampleType) + " BINDINGS: " + str(annotatedSamples) - if (annotatedSamples != None and annotatedSamples != ""): - #Annotations - #print "-----> Annotations" - if annotableSampleType not in typesToCopyFrom: - for sampleLine in annotatedSamples.split("\\"): - propertyTypes = getPropertyTypesForSampleTypeFromAnnotableType(annotableSampleType, annotableType) - identifier = None - permId = None - sampleLink = None - for sampleProperty in sampleLine.split(";"): - propertyName = sampleProperty.split(":")[0] - propertyValue = sampleProperty.split(":")[1] - if propertyName == "identifier": - identifier = propertyValue - permId = entityInformationProvider().getSamplePermId(propertyValue) - sampleLink = elementFactory().createSampleLink(permId) - sampleLink.addAttribute(propertyName, propertyValue) - sampleLink.addAttribute('sampleType', annotableSampleType) - elif propertyName in propertyTypes: - sampleLink.addAttribute(propertyName, propertyValue) - else: - raise NameError('Found invalid property: ' + propertyName + " on type " + annotableSampleType) - if identifier is not None: - elements.append(sampleLink) - #Links - #print "-----> links" - for typeToCopyFrom in typesToCopyFrom: - typeToCopy = typesToCopyFrom[typeToCopyFrom] - #print "-----> TYPE TO COPY FROM: " + str(typeToCopyFrom) - #print "-----> TYPE TO COPY: " + str(typeToCopy) - identifiersToCopyFrom = bindings.get(typeToCopyFrom) - if identifiersToCopyFrom is not None: - #print "-----> IDENTIFIERS TO COPY FROM: " + str(identifiersToCopyFrom) - identifiersForCopy = identifiersToCopyFrom.split(',') - for identifierToCopyFrom in identifiersForCopy: - #print "-----> IDENTIFIER TO COPY FROM: " + str(identifierToCopyFrom) - permIdFromIdentifier = entityInformationProvider().getSamplePermId(identifierToCopyFrom) - #print "-----> PERMID TO COPY FROM: " + str(permIdFromIdentifier) - parentsToCopyFromPermId = entityInformationProvider().getSamplePropertyValue(permIdFromIdentifier, "ANNOTATIONS_STATE") - #print "-----> ELEMENTS TO COPY: " + str(parentsToCopyFromPermId) - parentElements = list(propertyConverter().convertStringToElements(parentsToCopyFromPermId)) - for parentAnnotation in parentElements: - if parentAnnotation.getAttribute("sampleType") == typeToCopy: - parentAnnotation.addAttribute("CONTAINED", identifierToCopyFrom) - #print "-----> COPYING: " + str(parentAnnotation.getAttribute('identifier')) - elements.append(parentAnnotation) - property.value = propertyConverter().convertToString(elements) \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/nucleotide_count.py b/plasmid/source/core-plugins/weismigration/1/compatibility/nucleotide_count.py deleted file mode 100644 index e7630820e04b82ee92614b9951711a6343a8ec58..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/nucleotide_count.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result = len(re.findall("R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_name.py b/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_name.py deleted file mode 100644 index 137e26f9b9adeee242f5107ad5c8976b0f321dd5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_name.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - code= entity.entityPE().code - - return code \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_refnum.py b/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_refnum.py deleted file mode 100644 index ff132a9cf1579cb889e3c88de8d723513ae64e12..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/oligo_refnum.py +++ /dev/null @@ -1,9 +0,0 @@ -import re -def calculate(): - code = entity.entityPE().code - if re.search ('UC', code): - codeNum= entity.entityPE().code.split('UC') - elif re.search('CH',code): - codeNum= entity.entityPE().code.split('CH') - - return codeNum[1] diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_name.py b/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_name.py deleted file mode 100644 index 2d2bbeacf7138dc70be363ee71a948607371db47..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_name.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - codeNum= entity.entityPE().code.split('PKW') - plasmidName='pKW'+codeNum[1] - return plasmidName \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_refnum.py b/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_refnum.py deleted file mode 100644 index 2986b14ea77d0b48decab8ce96efefb34da69ed2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/plasmid_refnum.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - codeNum= entity.entityPE().code.split('PKW') - - return codeNum[1] diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/strain_glycerol_stock_number.py b/plasmid/source/core-plugins/weismigration/1/compatibility/strain_glycerol_stock_number.py deleted file mode 100644 index bf6c13c2617528d18b0bcc31766996534bb3b298..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/strain_glycerol_stock_number.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - codeNum= entity.entityPE().code.split('KWY') - - return codeNum[1] \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/strain_name.py b/plasmid/source/core-plugins/weismigration/1/compatibility/strain_name.py deleted file mode 100644 index 137e26f9b9adeee242f5107ad5c8976b0f321dd5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/strain_name.py +++ /dev/null @@ -1,4 +0,0 @@ -def calculate(): - code= entity.entityPE().code - - return code \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/sysname_calculation.py b/plasmid/source/core-plugins/weismigration/1/compatibility/sysname_calculation.py deleted file mode 100644 index 6777c648ee0851d8a099376e1e1bdd7cf1db8cef..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/sysname_calculation.py +++ /dev/null @@ -1,33 +0,0 @@ -import re - -def calculate_sysname(): - result = (len(re.findall("A|a|T|t", entity.propertyValue('SEQUENCE'))) * 100)/len(re.findall("A|a|C|c|G|g|T|t|U|u", entity.propertyValue('SEQUENCE'))) - - type=entity.propertyValue('OLIGO_TYPE') - if type == "DNA": - type = "d" - else: - type ="r" - - sense= entity.propertyValue('SENSE') - if sense == "SENSE": - sense = "s" - elif sense == "ANTISENSE": - sense ="a" - - group = entity.propertyValue('GROUP') - - - fromNuc = entity.propertyValue('FROM_NUC') - - - toNuc= entity.propertyValue('TONUC') - - - - result = type + "-" +sense +"-" +group + "-" + "[" +fromNuc +"-"+toNuc+"]" - - return result - -def calculate(): - return calculate_sysname() \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/thymidine_count.py b/plasmid/source/core-plugins/weismigration/1/compatibility/thymidine_count.py deleted file mode 100644 index 9d9db9385a916e533b74363d60f9b2acefecb8aa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/thymidine_count.py +++ /dev/null @@ -1 +0,0 @@ -entity.propertyValue('SEQUENCE').count('T')+entity.propertyValue('SEQUENCE').count('t') \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/compatibility/tm.py b/plasmid/source/core-plugins/weismigration/1/compatibility/tm.py deleted file mode 100644 index a841d384a3226c09d47d7e72cccd7cb8aa52cc56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/compatibility/tm.py +++ /dev/null @@ -1,9 +0,0 @@ -import re - -def calculate_Onuc(): - result =68.3+ (0.41* float(len(re.findall("G|g|C|c", entity.propertyValue('SEQUENCE'))) * 100)/float(len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))))) -(600/float(len(re.findall("A|a|C|c|G|g|T|t|R|r|Y|y|M|m|K|k|S|s|W|w|H|h|b|B|D|d|X|x|n|N", entity.propertyValue('SEQUENCE'))))) - - return result - -def calculate(): - return calculate_Onuc() diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/add_plasmid_parents.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/add_plasmid_parents.py deleted file mode 100644 index 5bf1013b2d6b4672fbbf28736f3d3e8d22a1d3aa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/add_plasmid_parents.py +++ /dev/null @@ -1,152 +0,0 @@ -#Dropbox for updating PLASMID samples with Plasmid parents. The input is a txt file downlaoded from openBIS, containing the codes of teh plasmdis already registered, the parents and a property called Plasmid Parents. -#we read the property called plasmid parents and add these to the list of already existing parents. This has to be done in thi way, and cannot be done when creating the plasmids, becuase to set plasmid parenst these have to be already registered in openBIS. -# - -import os, re, glob, shutil,csv - - -print "###################################################" - - - -#read txt file -def parse_incoming(tr): - data_rows = [] - f = open(tr.getIncoming().getAbsolutePath(), 'rU') - dialect = csv.Sniffer().sniff(f.read(1024)) - f.seek(0) - reader = csv.DictReader(f, dialect=dialect) - for row in reader: - data_rows.append(row) - f.close() - return data_rows - -def update_sample_with_parents(tr, sample_dict): - """ Get the specified sample or register it if necessary """ - - space_code = "MATERIALS" - project_code = "PLASMIDS" - # The dictionary keys come from the CSV file - sample_code = sample_dict['Code'] - parents_code=sample_dict['Parents'] - parents_code_list=re.split(" ", parents_code) - plasmid_list=[] - plasmid_parent_code = sample_dict['Parent plasmid'] - plasmid_parent_code_split = re.split("/|\+|-|\?|\(|\)|\ and |", plasmid_parent_code) - print sample_code, plasmid_parent_code_split - - - sample_id = "/%(space_code)s/%(sample_code)s" % vars() - - for name in plasmid_parent_code_split: - sample = tr.getSample(sample_id) - sample_for_update = tr.makeSampleMutable(sample) - if sample_id == "/MATERIALS/PKW3386": - sample_for_update.setParentSampleIdentifiers(['/MATERIALS/PKW3363', '/MATERIALS/PKW3355']) - if not sample_id =="/MATERIALS/PKW581" and not sample_id == "/MATERIALS/PKW3386" and not sample_id == "/MATERIALS/PKW3158": - if re.search ("pKW ", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW ","PKW").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKW467 pRS CRM1", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW467 pRS CRM1","PKW467").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKW468 pRS CRM1", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW468 pRS CRM1","PKW468").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("HA pKW2682", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("HA pKW2682","PKW2682").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKW639 pCFP", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW639 pCFP","PKW639").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - print "P2 : ", plasmid_list - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKW001", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW001","PKW1").strip() - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("PKW001", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("PKW001","PKW1").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pkw", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pkw","PKW").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKW", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKW","PKW").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("pKw", name): - plasmid_parent_id = "/MATERIALS/"+name.replace("pKw","PKW").strip() - print "PARENT: ", plasmid_parent_id - if not parents_code_list ==['']: - parents_code_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - plasmid_list.append(plasmid_parent_id) - sample_for_update.setParentSampleIdentifiers(plasmid_list) - elif re.search ("PKW", name): - plasmid_parent_id = "/MATERIALS/"+name.strip() - plasmid_list.append(plasmid_parent_id) - print "PARENT : ", plasmid_list - sample_for_update.setParentSampleIdentifiers(plasmid_list) - - - -def register_samples_in_openbis(tr, data_rows): - for sample_dict in data_rows: - update_sample_with_parents(tr, sample_dict) - - -def process(tr): - data_rows = parse_incoming(tr) - register_samples_in_openbis(tr, data_rows) \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plasmid_parents_030715.txt b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plasmid_parents_030715.txt deleted file mode 100644 index c1837af2a78c23eac526163a86cd3e477460a0e7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plasmid_parents_030715.txt +++ /dev/null @@ -1 +0,0 @@ -Code Parents Parent plasmid PKW1 PKW10 PKW100 pJG4-5 PKW1000 PKW1001 PKW1002 PKW1003 PKW1004 pKW 966 PKW1005 pKW 966 PKW1006 pKW 966 PKW1007 PKW1008 pKW710 PKW1009 pKW656 PKW101 pJG4-5 PKW1010 pKW710 PKW1011 pKW656 PKW1012 pKW927 PKW1013 pKW929 PKW1014 pKW999 (pPW66R) PKW1015 pKW999 (pPW66R) PKW1016 /MATERIALS/US386 /MATERIALS/US605 pKW347 PKW1017 pRS313 PKW1018 pRS313 PKW1019 pRS313 PKW102 pJG4-5 PKW1020 pRS313 PKW1021 pRS313 PKW1022 pRS313 PKW1023 PKW1024 pKW786 (pRS404) PKW1025 PKW1026 pKW345 PKW1027 pKW345 PKW1028 PKW1029 PKW103 pJG4-5 PKW1030 PKW1031 PKW1032 pKW345 PKW1033 pKW708 - pRS404 PKW1034 PKW1035 PKW1036 PKW1037 PKW1038 PKW1039 PKW104 pJG4-5 PKW1040 PKW1041 PKW1042 PKW1043 PKW1044 PKW1045 PKW1046 pKW343 PKW1047 pKW344 PKW1048 pKW1046 PKW1049 pKW1047 PKW105 pJG4-5 PKW1050 pKW1032 PKW1051 pRS305 (EBO 1107) PKW1052 pKW625 PKW1053 pKW625 PKW1054 PKW1055 PKW1056 PKW1057 PKW1058 PKW1059 PKW106 pJG4-5 PKW1060 pKW1052 PKW1061 PKW1062 PKW1063 PKW1064 pKW1048 PKW1065 pKW1049 PKW1066 pKW1050 PKW1067 pKW1048 PKW1068 pKW1049 PKW1069 pKW1050 PKW107 pJG4-5 PKW1070 PKW1071 PKW1072 PKW1073 PKW1074 PKW1075 PKW1076 PKW1077 PKW1078 /MATERIALS/US328 /MATERIALS/US704 pKW618 PKW1079 PKW108 pJG4-5 PKW1080 PKW1081 PKW1082 /MATERIALS/US661 /MATERIALS/US662 pKW1081/DP3570 PKW1083 /MATERIALS/US648 /MATERIALS/US649 pKW1081?DP3570 PKW1084 pKW1085 PKW1085 PKW1086 PKW1087 PKW1088 pRS313 PKW1089 pRS313 PKW109 pJG4-5 PKW1090 pRS313 PKW1091 pRS313 PKW1092 pRS313 PKW1093 pRS313 PKW1094 pRS313 PKW1095 pRS313 PKW1096 pRS313 PKW1097 pRS313 PKW1098 pRS313 PKW1099 pRS313 PKW11 pGEM7 PKW110 pJG4-5 PKW1100 pRS313 PKW1101 pRS313 PKW1102 pKW1064 PKW1103 pKW1065 PKW1104 pKW1066 PKW1105 pKW1067 PKW1106 pKW1068 PKW1107 pKW1069 PKW1108 pKW788 (pRS406) PKW1109 /MATERIALS/US761 /MATERIALS/US762 pKW 966 PKW111 pJG4-5 PKW1110 /MATERIALS/US755 /MATERIALS/US756 pKW 966 PKW1111 /MATERIALS/US755 /MATERIALS/US756 pKW 966 PKW1112 pKW 970 PKW1113 pKW 970 PKW1114 pKW617 PKW1115 pKW346 PKW1116 pKW617 PKW1117 /MATERIALS/US786 /MATERIALS/US787 pKW 966 PKW1118 /MATERIALS/US786 /MATERIALS/US787 pKW 966 PKW1119 /MATERIALS/US1002 /MATERIALS/US776 pKW 1270 PKW112 pJG4-5 PKW1120 pKW 1112 PKW1121 pKW 1120 PKW1122 pKW 1120 PKW1123 pKW 617 PKW1124 pKW 621 PKW1125 pKW 980 PKW1126 pKW 617 PKW1127 PKW1128 pCMV4-3HA PKW1129 PKW113 pJG4-5 PKW1130 PKW1131 PKW1132 PKW1133 PKW1134 pKW 1131 PKW1135 pKW 1131 PKW1136 pKW 1131 PKW1137 pKW 1131 PKW1138 pKW 1131 PKW1139 pEGFP-C1 PKW114 pJG4-5 PKW1140 pAS147 PKW1141 /MATERIALS/US607 /MATERIALS/US777 pKW350 PKW1142 /MATERIALS/US789 /MATERIALS/US790 pKW1125 PKW1143 pKW1125 PKW1144 pKW346 PKW1145 PKW1146 PKW1147 PKW1148 PKW1149 pKW1142 PKW115 pJG4-5 PKW1150 pKW617 PKW1151 pKW 621 PKW1152 PKW1153 pKW1152 PKW1154 pKW1113 PKW1155 pKW 1059 (pPD49.78) PKW1156 /MATERIALS/US800 /MATERIALS/US801 pKW 966 PKW1157 pKW 1153 PKW1158 pKW 1153 PKW1159 PKW116 pJG4-5 PKW1160 /MATERIALS/US814 /MATERIALS/US815 pKW 966 PKW1161 PKW1162 /MATERIALS/US803 /MATERIALS/US804 pKW409 PKW1163 /MATERIALS/US803 /MATERIALS/US804 pKW409 PKW1164 pKW1163 PKW1165 /MATERIALS/US817 /MATERIALS/US818 pKW999 PKW1166 pKW983 PKW1167 pKW983 PKW1168 pKW415 (pRS416-PGAL) PKW1169 pKW415 (pRS416-PGAL) PKW117 pJG4-5 PKW1170 PKW1171 PKW1172 PKW1173 PKW1174 pCDNA3 PKW1175 pKW347 PKW1176 pKW348 PKW1177 pKW349 PKW1178 pKW1052 PKW1179 /MATERIALS/US856 /MATERIALS/US857 pKW1168 PKW118 pJG4-5 PKW1180 /MATERIALS/US856 /MATERIALS/US857 pKW1169 PKW1181 PKW1182 PKW1183 PKW1184 /MATERIALS/US856 /MATERIALS/US898 pKW1168 PKW1185 /MATERIALS/US856 /MATERIALS/US898 pKW1169 PKW1186 /MATERIALS/US856 /MATERIALS/US898 pKW673 PKW1187 /MATERIALS/US856 /MATERIALS/US898 pKW674 PKW1188 pKW832 PKW1189 /MATERIALS/US919 /MATERIALS/US920 pKW786 PKW119 pJG4-5 PKW1190 /MATERIALS/US919 /MATERIALS/US920 pKW788 PKW1191 pKW786 PKW1192 /MATERIALS/US851 /MATERIALS/US923 pKW788 PKW1193 pKW351 PKW1194 pKW352 PKW1195 pKW353 PKW1196 pKW351 PKW1197 pKW352 PKW1198 pKW353 PKW1199 pKW351 PKW12 PKW120 pJG4-5 PKW1200 pKW352 PKW1201 pKW353 PKW1202 pKW351 PKW1203 pKW352 PKW1204 pKW353 PKW1205 pKW351 PKW1206 pKW352 PKW1207 pKW353 PKW1208 pKW351 PKW1209 pKW352 PKW121 pJG4-5 PKW1210 pKW353 PKW1211 pKW351 PKW1212 pKW352 PKW1213 pKW353 PKW1214 pKW351 PKW1215 pKW352 PKW1216 pKW353 PKW1217 pKW351 PKW1218 pKW352 PKW1219 pKW353 PKW122 pJG4-5 PKW1220 pKW347 PKW1221 pKW348 PKW1222 pKW966 PKW1223 pKW987 PKW1224 pKW966 PKW1225 PKW1226 PKW1227 PKW1228 pKW1151 PKW1229 /MATERIALS/US946 /MATERIALS/US947 pKW970 PKW123 pJG4-5 PKW1230 pKW1224 PKW1231 pKW1151 PKW1232 pKW1151 PKW1233 pKW1229 PKW1234 pKW970 PKW1235 pKW1244 PKW1236 pKW1244 PKW1237 PKW1238 PKW1239 PKW124 pJG4-5 PKW1240 PKW1241 PKW1242 PKW1243 PKW1244 PKW1245 PKW1246 PKW1247 PKW1248 pKW1229 PKW1249 pKW1233 PKW125 pJG4-5 PKW1250 PKW1251 /MATERIALS/US530 /MATERIALS/US814 pKW1249 PKW1252 /MATERIALS/US529 /MATERIALS/US815 pKW 1249 PKW1253 /MATERIALS/US913 /MATERIALS/US914 pKW1249 PKW1254 /MATERIALS/US915 /MATERIALS/US916 pKW1249 PKW1255 pKW999 PKW1256 pKW999 PKW1257 pKW1152 PKW1258 PKW1259 PKW126 pJG4-5 PKW1260 PKW1261 PKW1262 PKW1263 PKW1264 PKW1265 /MATERIALS/US998 /MATERIALS/US999 pKW966 PKW1266 /MATERIALS/US997 /MATERIALS/US998 pKW1229 PKW1267 /MATERIALS/US1000 /MATERIALS/US999 pKW1229 PKW1268 /MATERIALS/US1000 /MATERIALS/US1001 pKW1229 PKW1269 /MATERIALS/US998 /MATERIALS/US999 pKW1229 PKW127 pJG4-5 PKW1270 pKW970 PKW1271 PKW1272 pKW1255 PKW1273 pKW1256 PKW1274 pKW1257 PKW1275 pKW1257 PKW1276 pKW1270 PKW1277 /MATERIALS/US1011 PKW1278 /MATERIALS/US1012 PKW1279 pKW1270 PKW128 pJG4-5 PKW1280 pKW1270 PKW1281 pKW1113 PKW1282 pKW1270 PKW1283 PKW1284 PKW1285 PKW1286 PKW1287 PKW1288 PKW1289 pKW1276 PKW129 pJG4-5 PKW1290 pKW 762 PKW1291 pKW903 PKW1292 PKW1293 PKW1294 PKW1295 PKW1296 1113 PKW1297 pKW1296 PKW1298 pKW13 PKW1299 pKW13 PKW13 pSG6 PKW130 pJG4-5 PKW1300 PKW1301 pKW1296 PKW1302 pKW1297 PKW1303 pKW1297 PKW1304 pKW1300 PKW1305 pKW1300 PKW1306 pKW1300 PKW1307 pKW1300 PKW1308 pKW1300 PKW1309 pKW1029 - YCpRPL25-Flag PKW131 pJG4-5 PKW1310 /MATERIALS/US1057 /MATERIALS/US1058 pKW503 - pBluescript II KS PKW1311 pRS315 PKW1312 PKW1313 /MATERIALS/US1060 /MATERIALS/US1061 pKW1310 - pBS RRP6 PKW1314 pEG202 PKW1315 pEG202 PKW1316 pJG4-5 PKW1317 pJG4-5 PKW1318 pJG4-5 PKW1319 pJG4-5 PKW132 pJG4-5 PKW1320 pEG202 PKW1321 pSV271 PKW1322 pSV272 PKW1323 pSV271 PKW1324 pSV272 PKW1325 pSV271 PKW1326 pSV272 PKW1327 pKW1336 PKW1328 pKW1337 PKW1329 pSV271 PKW133 pJG4-5 PKW1330 pSV272 PKW1331 pSV271 PKW1332 pSV272 PKW1333 pKW657 PKW1334 pKW657 PKW1335 pKW657 PKW1336 pKW657 PKW1337 pKW657 PKW1338 pKW657 PKW1339 pKW657 PKW134 pJG4-5 PKW1340 pKW1557 PKW1341 PKW1342 PKW1343 PKW1344 PKW1345 pKW1272 PKW1346 pKW1272 PKW1347 pKW1329 PKW1348 pKW1330 PKW1349 pKW1331 PKW135 pJG4-5 PKW1350 pKW1332 PKW1351 pKW1336 PKW1352 pKW1337 PKW1353 pKW1341 PKW1354 pKW1319 PKW1355 pKW1249 PKW1356 pKW1249 PKW1357 YIplac211 PKW1358 YIplac204 PKW1359 pKW1220 PKW136 pJG4-5 PKW1360 pKW709 PKW1361 /MATERIALS/US1071 /MATERIALS/US803 pKW1162 PKW1362 /MATERIALS/US1072 /MATERIALS/US803 pKW1162 PKW1363 /MATERIALS/US1073 /MATERIALS/US803 pKW1162 PKW1364 /MATERIALS/US803 /MATERIALS/US804 pKW1162 PKW1365 /MATERIALS/US803 /MATERIALS/US804 pKW1162 PKW1366 pKW1220 PKW1367 pKW708 - pRS304 PKW1368 pKW1273 PKW1369 pKW1272 PKW137 pJG4-5 PKW1370 pKW1273 PKW1371 pKW1272 PKW1372 pKW1273 PKW1373 pKW 966 PKW1374 /MATERIALS/US1129 /MATERIALS/US1130 pET p97 (pKW485) PKW1375 /MATERIALS/US1129 /MATERIALS/US1130 pET-p97[1-601] (pKW 747) PKW1376 pKW1359 PKW1377 PKW1378 PKW1379 PKW138 pJG4-5 PKW1380 pKW657 - pGEX 4T-1 PKW1381 /MATERIALS/US102 /MATERIALS/US1158 pKW1373 PKW1382 /MATERIALS/US102 /MATERIALS/US1159 pKW1373 PKW1383 pKW503 PKW1384 pKW503 - pBluescript II KS+ PKW1385 /MATERIALS/US1137 /MATERIALS/US1138 pKW354 PKW1386 PKW1387 PKW1388 PKW1389 PKW139 pJG4-5 PKW1390 PKW1391 PKW1392 PKW1393 PKW1394 PKW1395 PKW1396 PKW1397 pKW868 PKW1398 PKW1399 PKW14 pSG8 PKW140 pJG4-5 PKW1400 PKW1401 PKW1402 PKW1403 PKW1404 PKW1405 PKW1406 PKW1407 pKW926 PKW1408 pKW349 PKW1409 pKW928 PKW141 pJG4-5 PKW1410 pKW348 PKW1411 /MATERIALS/US1092 /MATERIALS/US1138 pKW345 - pRS315(G) PKW1412 /MATERIALS/US1092 /MATERIALS/US1099 pKW345 - pRS315(G) PKW1413 /MATERIALS/US1099 /MATERIALS/US1211 pKW345 - pRS315(G) PKW1414 /MATERIALS/US1138 /MATERIALS/US1211 pKW345 - pRS315(G) PKW1415 pKW1558 PKW1416 pKW1558 PKW1417 pKW961 PKW1418 /MATERIALS/US1214 /MATERIALS/US1215 pKW 970 PKW1419 pRS426 (pKW354) PKW142 pJG4-5 PKW1420 pKW 1418 PKW1421 /MATERIALS/US1229 /MATERIALS/US1231 pKW1169 PKW1422 /MATERIALS/US1229 /MATERIALS/US1231 pKW1169 PKW1423 pKW1384 PKW1424 /MATERIALS/US1228 /MATERIALS/US1230 pKW1169 PKW1425 /MATERIALS/US1228 /MATERIALS/US1230 pKW1185 PKW1426 /MATERIALS/US1228 /MATERIALS/US1229 pKW1424 PKW1427 /MATERIALS/US1228 /MATERIALS/US1229 pKW1425 PKW1428 pKW927 PKW1429 /MATERIALS/US1252 /MATERIALS/US1253 pKW348 PKW143 pJG4-5 PKW1430 pKW1557 PKW1431 pKW349 PKW1432 /MATERIALS/US1070 /MATERIALS/US803 pkw1361 PKW1433 /MATERIALS/US1135 /MATERIALS/US803 pkw1361 PKW1434 /MATERIALS/US1136 /MATERIALS/US803 pKW1361 PKW1435 /MATERIALS/US1134 /MATERIALS/US803 pKW1361 PKW1436 PKW1437 PKW1438 pKW346 PKW1439 pKW1228 PKW144 pKW149 - pSGK-45 PKW1440 pKW1228 PKW1441 pKW349 PKW1442 pKW931 PKW1443 pKW1430 PKW1444 pKW1443 PKW1445 pKW1443 PKW1446 PKW1447 pKW409-pGFPS65T-NES PKW1448 pKW927 PKW1449 pKW 486 PKW145 pSGK1 PKW1450 pET 30a PKW1451 /MATERIALS/US1256 /MATERIALS/US1258 pET 30a PKW1452 /MATERIALS/US1146 /MATERIALS/US1257 pET 30a PKW1453 /MATERIALS/US1257 /MATERIALS/US1258 pET 30a PKW1454 /MATERIALS/US190 /MATERIALS/US803 pKW349 - pRS315 PKW1455 PKW1456 PKW1457 pKW931 PKW1458 pKW1407 PKW1459 pKW1611 - pSV271 PKW146 pKW149 - pSGK-45 PKW1460 pKW349 PKW1461 pKW933 PKW1462 /MATERIALS/US1280 /MATERIALS/US1281 pKW 1113 PKW1463 /MATERIALS/US1236 /MATERIALS/US1237 pKW 987 PKW1464 PKW1465 PKW1466 PKW1467 PKW1468 PKW1469 PKW147 pKW149 - pSGK-45 PKW1470 pKW1331 PKW1471 pKW1332 PKW1472 pKW1346 PKW1473 pKW1346 PKW1474 pKW1443 PKW1475 pKW970 PKW1476 pKW987 PKW1477 pKW349 PKW1478 pKW1443 PKW1479 pKW1477 PKW148 pKW149 - pSGK-45 PKW1480 pKW1477 PKW1481 pKW1477 PKW1482 pKW1477 PKW1483 pKW1477 PKW1484 pKW1477 PKW1485 pKW1477 PKW1486 pKW1477 PKW1487 pKW1477 PKW1488 pKW1477 PKW1489 pKW1558 PKW149 pSGK1 PKW1490 pKW1558 PKW1491 pKW975 PKW1492 /MATERIALS/US1146 /MATERIALS/US1317 pKW 1467 PKW1493 /MATERIALS/US1146 /MATERIALS/US1257 pKW 1467 PKW1494 pKW1484 PKW1495 pKW1485 PKW1496 pKW1486 PKW1497 pKW1484 PKW1498 pKW1485 PKW1499 pKW1486 PKW15 PKW150 pSGK1 PKW1500 pKW1484 PKW1501 pKW1485 PKW1502 pKW1486 PKW1503 PKW1504 pKW1221 PKW1505 pKW1504 PKW1506 YCPlac33 PKW1507 PKW1508 pKW431 PKW1509 PKW151 pKW149 - pSGK-45 PKW1510 PKW1511 PKW1512 PKW1513 PKW1514 PKW1515 PKW1516 PKW1517 PKW1518 PKW1519 PKW152 pKW149 - pSGK-45 PKW1520 PKW1521 PKW1522 PKW1523 PKW1524 PKW1525 PKW1526 PKW1527 pKW346 PKW1528 pKW346 PKW1529 pKW346 PKW153 pSGK1 PKW1530 /MATERIALS/US1291 /MATERIALS/US1292 pKW1346 PKW1531 /MATERIALS/US1379 /MATERIALS/US1380 pKW 966 PKW1532 PKW1533 pALR10 PKW1534 PKW1535 PKW1536 pKW503 PKW1537 pKW970 PKW1538 /MATERIALS/US1361 /MATERIALS/US1362 pKW1473 PKW1539 /MATERIALS/US1361 /MATERIALS/US1362 pKW1473 PKW154 pSGK1 PKW1540 /MATERIALS/US1399 /MATERIALS/US789 pKW1473 PKW1541 /MATERIALS/US1399 /MATERIALS/US789 pKW1473 PKW1542 PKW1543 /MATERIALS/US1313 /MATERIALS/US1365 pKW963 PKW1544 pECFP-C1 PKW1545 pKW966 PKW1546 /MATERIALS/US1257 /MATERIALS/US1400 pKW1532 PKW1547 pKW927 PKW1548 pKW503 PKW1549 pKW1536 PKW155 pKW149 - pSGK-45 PKW1550 pKW1472 PKW1551 pKW1472 PKW1552 pKW1430 PKW1553 pKW1444 PKW1554 pKW1445 PKW1555 pKW1478 PKW1556 pKW1505 PKW1557 pKW1558 PKW1558 pKW349 PKW1559 pKW1505 PKW156 pKW146 - pSGK-21 PKW1560 pKW1505 PKW1561 pKW1505 PKW1562 PKW1563 PKW1564 PKW1565 pKW1341 PKW1566 pKW503 PKW1567 pKW503 PKW1568 pKW503 PKW1569 pKW503 PKW157 pUEXI PKW1570 pKW503 PKW1571 pKW503 PKW1572 pKW708 PKW1573 pKW708 PKW1574 PKW1575 /MATERIALS/US1361 /MATERIALS/US1398 pKw1530 PKW1576 pKW1443 PKW1577 pKW1474 PKW1578 /MATERIALS/US492 /MATERIALS/US493 pKW 312 PKW1579 pKW1548 PKW158 pEG202 PKW1580 pKW784 PKW1581 pKW784 PKW1582 pKW927 PKW1583 pKW503 PKW1584 pKW1476 PKW1585 pKW970 PKW1586 pKW1578 PKW1587 pKW1585 PKW1588 /MATERIALS/US1388 /MATERIALS/US1389 pKW 975 PKW1589 pBlueScript PKW159 pSH17-4 PKW1590 pBlueScript PKW1591 PKW1592 pKW 1475 PKW1593 PKW1594 PKW1595 PKW1596 pKW503 PKW1597 PKW1598 PKW1599 PKW16 pGEM-5Zf PKW160 pKW158 - pEG202 PKW1600 pKW970 PKW1601 pKW1592 PKW1602 PKW1603 PKW1604 PKW1605 pKW1008 PKW1606 pKW1605 PKW1607 PKW1608 pKW1592 PKW1609 pGEX-2TK PKW161 pJK101 PKW1610 PKW1611 PKW1612 pKW968 PKW1613 pKW 969 PKW1614 pKW 972 PKW1615 pKW 973 PKW1616 pKW 1592 PKW1617 pKW344 PKW1618 PKW1619 pKW1618 PKW162 LR1Del1 PKW1620 /MATERIALS/US1486 /MATERIALS/US1487 pKW 1257 PKW1621 /MATERIALS/US1378 /MATERIALS/US1381 pKW810 PKW1622 pKW1621 PKW1623 pKW1621 PKW1624 pKW1621 PKW1625 pKW1006 PKW1626 /MATERIALS/US1446 /MATERIALS/US1461 pKW 1622 PKW1627 /MATERIALS/US1446 /MATERIALS/US1461 pKW 1622 PKW1628 pKW230 PKW1629 /MATERIALS/US1448 /MATERIALS/US1449 pKW 1467 PKW163 pKW158 - pEG202 PKW1630 pKW1257 PKW1631 pKW1630 PKW1632 pKW349 PKW1633 pKW349 PKW1634 pKW 1629 PKW1635 pKW1628 PKW1636 /MATERIALS/US102 /MATERIALS/US1466 pKW 1587 PKW1637 /MATERIALS/US102 /MATERIALS/US539 pKW 966 PKW1638 /MATERIALS/US102 /MATERIALS/US538 pKW 966 PKW1639 /MATERIALS/US102 /MATERIALS/US539 pKW 1592 PKW164 pJG4-5 PKW1640 pKW1254 PKW1641 pKW 1600 PKW1642 pKW348 PKW1643 pkw983 PKW1644 pkw983 PKW1645 PKW1646 PKW1647 PKW1648 pKW 1585 PKW1649 pKW1642 PKW165 pKW163 - pEG202+4 PKW1650 pKW1642 PKW1651 pKW1642 PKW1652 pKW1642 PKW1653 pKW1642 PKW1654 pKW1642 PKW1655 pKW1642 PKW1656 pKW1642 PKW1657 pKW1642 PKW1658 /MATERIALS/US1496 /MATERIALS/US1497 pKW503 - pBluescript II KS+ PKW1659 pKW 1585 PKW166 pKW165 - pEG80 PKW1660 /MATERIALS/US102 /MATERIALS/US1466 pKW 1592 PKW1661 /MATERIALS/US102 /MATERIALS/US1528 pKW 966 PKW1662 /MATERIALS/US1517 /MATERIALS/US1518 pKW1620 PKW1663 PKW1664 PKW1665 PKW1666 PKW1667 PKW1668 PKW1669 pKW348 PKW167 pJG4-5 PKW1670 pKW1669 PKW1671 pKW1669 PKW1672 pKW1669 PKW1673 /MATERIALS/US1557 /MATERIALS/US1558 pKW503 - pBluescript II KS+ PKW1674 pKW758 - pAFS52 lac operator PKW1675 PKW1676 pSV271 PKW1677 pSV272 PKW1678 PKW1679 pKW 1585 PKW168 pJG4-5 PKW1680 pKW 1585 PKW1681 pKW 1585 PKW1682 PKW1683 PKW1684 pKW 1587 PKW1685 pKW960 PKW1686 pKW1685 PKW1687 pKW 1685 PKW1688 pKW658 - pGEX-4T-2 PKW1689 pKW1674 - pAFS52-lacOp-YBR022W PKW169 pJG4-5 PKW1690 /MATERIALS/US1592 /MATERIALS/US1594 pKW353 PKW1691 PKW1692 /MATERIALS/US1599 /MATERIALS/US1600 pKW 1274 PKW1693 /MATERIALS/US1593 /MATERIALS/US1594 pKW353 PKW1694 pKW1224 PKW1695 pCDNA6.2/V5/GW/D-TOPO (Invitrogen) PKW1696 pCDNA6.2/V5/GW/D-TOPO (Invitrogen) PKW1697 /MATERIALS/US1617 /MATERIALS/US1618 pKW1690 PKW1698 pRS306 INO1 PKW1699 p6INO1lac128 PKW17 PKW170 pJG4-5 PKW1700 PKW1701 pKW1697 PKW1702 pKW1697 PKW1703 pKW1697 PKW1704 pKW1697 PKW1705 pKW1601 PKW1706 /MATERIALS/US1617 /MATERIALS/US1618 pKW1693 PKW1707 pKW 1462 PKW1708 pKW1467 PKW1709 pKW1467 PKW171 pJG4-5 PKW1710 pKW1467 PKW1711 pKW 1601 PKW1712 /MATERIALS/US1599 /MATERIALS/US1600 pKW1528 PKW1713 pKW348 PKW1714 pKW348 PKW1715 pKW348 PKW1716 pSV272 PKW1717 pSV212 PKW1718 pKW350 PKW1719 pKW1611 PKW172 pKW163 - pEG202+4 PKW1720 pSV272 PKW1721 pKW708 PKW1722 PKW1723 PKW1724 PKW1725 pKW230 PKW1726 /MATERIALS/US1619 /MATERIALS/US1620 PKW1258 PKW1727 pKW350 PKW1728 pKW350 PKW1729 pKW350 PKW173 pKW158 - pEG202 PKW1730 PKW1731 pKW 1707 PKW1732 pKW1725 PKW1733 /MATERIALS/US1599 /MATERIALS/US1600 pKW1258 PKW1734 /MATERIALS/US1599 /MATERIALS/US1600 pKW1258 PKW1735 /MATERIALS/US1623 /MATERIALS/US1624 pKW1258 PKW1736 pKW1156 PKW1737 pKW708 PKW1738 PKW1739 pKW348 PKW174 pKW158 - pEG202 PKW1740 pKW348 PKW1741 pKW348 PKW1742 pKW1358 PKW1743 pKW347 PKW1744 pKW349 PKW1745 pKW 1601 PKW1746 pKW 1601 PKW1747 pKW1601 PKW1748 pKW 1601 PKW1749 pKW1601 PKW175 pKW158 - pEG202 PKW1750 pKW1601 PKW1751 /MATERIALS/US1687 /MATERIALS/US1688 pKW1291 PKW1752 pKW1706 (NUP59-CFP) PKW1753 pSV272 PKW1754 pKW348 PKW1755 pKW348 PKW1756 pKW348 PKW1757 pKW347 PKW1758 pKW348 PKW1759 pKW349 PKW176 pKW158 - pEG202 PKW1760 pKW343 PKW1761 pKW344 PKW1762 pKW345 PKW1763 pKW346 PKW1764 pKW347 PKW1765 pKW347 PKW1766 pKW348 PKW1767 pKW348 PKW1768 pKW349 PKW1769 pKW349 PKW177 pKW158 - pEG202 PKW1770 pKW350 PKW1771 pKW350 PKW1772 pKW350 PKW1773 PKW1774 PKW1775 PKW1776 pKW348 PKW1777 /MATERIALS/US1600 /MATERIALS/US1696 pKW 1258 PKW1778 /MATERIALS/US1600 /MATERIALS/US1697 pKW1258 PKW1779 /MATERIALS/US1600 /MATERIALS/US1698 pKW1258 PKW178 pKW172 - pEG-XCons PKW1780 pKW349 PKW1781 pKW1258 PKW1782 pKW1301 PKW1783 pKW1216 (NLS-RFP) PKW1784 PKW1785 PKW1786 PKW1787 pKW708 PKW1788 pRS314 PKW1789 pKW1788 PKW179 pKW178 - pEG-XCons-941/942 PKW1790 pKW1788 PKW1791 PKW1792 PKW1793 /MATERIALS/US1766 /MATERIALS/US1767 pKW1544 PKW1794 /MATERIALS/US1759 /MATERIALS/US1760 pCW405 PKW1795 pKW1793 PKW1796 pKW589 PKW1797 pKW589 PKW1798 pKW589 PKW1799 pKW589 PKW18 PKW180 pKW178 - pEG-XCons-941/942 PKW1800 pKW589 PKW1801 pKW589 PKW1802 pKW589 PKW1803 pKW1742 PKW1804 /MATERIALS/US1795 /MATERIALS/US1796 pKW970 PKW1805 pKW1743 PKW1806 pKW1472 PKW1807 pKW1472 PKW1808 pKW1745 PKW1809 pKT127 PKW181 pKW178 - pEG-XCons-941/942 PKW1810 pKT128 PKW1811 pKT209 PKW1812 pKT127 PKW1813 pKT128 PKW1814 pKW710 PKW1815 pKW708 PKW1816 pKW1721 PKW1817 PKW1818 pKW349 PKW1819 PKW182 pKW178 - pEG-XCons-941/942 PKW1820 pKW1818 PKW1821 PKW1822 PKW1823 PKW1824 PKW1825 PKW1826 PKW1827 PKW1828 PKW1829 pKW1472 PKW183 pKW178 - pEG-XCons-941/942 PKW1830 /MATERIALS/US1790 /MATERIALS/US1791 pKW1276 PKW1831 PKW1832 PKW1833 pKW708 PKW1834 pKW1833 PKW1835 pKW1768 PKW1836 pKW1768 PKW1837 pKW1769 PKW1838 /MATERIALS/US1842 /MATERIALS/US1843 pKW988- Pho4-GFP3 PKW1839 pKW1769 PKW184 pKW178 - pEG-XCons-941/942 PKW1840 pKW349 PKW1841 pKW1081 PKW1842 PKW1843 PKW1844 pKW1608 PKW1845 pKW1841 PKW1846 pFBHTC PKW1847 /MATERIALS/US1779 /MATERIALS/US1780 pKW503 PKW1848 /MATERIALS/US1779 /MATERIALS/US1780 pKW503 PKW1849 pKW1472 PKW185 pKW178 - pEG-XCons-941/942 PKW1850 pKW1472 PKW1851 /MATERIALS/US1737 /MATERIALS/US1738 pKW1642 PKW1852 /MATERIALS/US1737 /MATERIALS/US1738 pKW1642 PKW1853 pBACe3.6 PKW1854 pBACe3.6 PKW1855 PKW1856 PKW1857 PKW1858 PKW1859 pKW1648 PKW186 pKW178 - pEG-XCons-941/942 PKW1860 /MATERIALS/US1895 /MATERIALS/US1896 pKW1608 PKW1861 pEGFP-C1 PKW1862 pKW1648 PKW1863 pKW1721 PKW1864 pKW1815 PKW1865 pKW1844 PKW1866 PKW1867 pKW710 PKW1868 /MATERIALS/US578 /MATERIALS/US582 pKW709 PKW1869 PKW187 pKW178 - pEG-XCons-941/942 PKW1870 pkw1348 PKW1871 pKW1864 PKW1872 PKW1873 pKW657 PKW1874 pKW657 PKW1875 PKW1876 PKW1877 PKW1878 PKW1879 PKW188 pKW178 - pEG-XCons-941/942 PKW1880 pET101DTOPO PKW1881 pKW1880 PKW1882 /MATERIALS/US2000 /MATERIALS/US2001 pKW1467 PKW1883 PKW1884 pKW1818 PKW1885 pKW1820 PKW1886 pKW1834 PKW1887 maybe EBO347 (pKW845) PKW1888 PKW1889 PKW189 pKW178 - pEG-XCons-941/942 PKW1890 PKW1891 /MATERIALS/US2025 /MATERIALS/US2026 pKW195 PKW1892 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1893 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1894 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1895 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1896 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1897 "pGFP-Cb (Shulga,Goldfarb 1999)" PKW1898 pKW349 PKW1899 /MATERIALS/US1879 /MATERIALS/US1880 pKW631 PKW19 pUEXI PKW190 pUEXI PKW1900 /MATERIALS/US2027 /MATERIALS/US2028 pKW 1891 PKW1901 pKW1348 PKW1902 /MATERIALS/US2026 /MATERIALS/US2076 pKW195 PKW1903 pKW1902 PKW1904 PKW1905 PKW1906 pKW961 PKW1907 /MATERIALS/US2027 /MATERIALS/US2028 pKW1902 PKW1908 /MATERIALS/US2027 /MATERIALS/US2028 pKW1902 PKW1909 pKW1901 PKW191 PKW1910 pKW657 PKW1911 pKW657 PKW1912 pKW657 PKW1913 pKW657 PKW1914 pKW1314 PKW1915 PKW1916 pKW1329 PKW1917 pKW1329 PKW1918 pKW1329 PKW1919 pKW1329 PKW192 pKW350 - pRS316 PKW1920 pKW1329 PKW1921 PKW1922 PKW1923 pSV272 PKW1924 PKW1925 /MATERIALS/US2103 /MATERIALS/US2104 pKW1924 PKW1926 /MATERIALS/US2103 /MATERIALS/US2104 pKW1924 PKW1927 pKW1924 PKW1928 PKW1929 PKW193 pKW15 - pVT102-U PKW1930 PKW1931 PKW1932 PKW1933 PKW1934 PKW1935 PKW1936 PKW1937 pKW1472 PKW1938 pKW1833 PKW1939 pKW1050 PKW194 pSG5 PKW1940 PKW1941 PKW1942 PKW1943 pALR10 PKW1944 PKW1945 PKW1946 PKW1947 PKW1948 PKW1949 PKW195 pRSET A PKW1950 /MATERIALS/US2143 /MATERIALS/US2144 pKW656 PKW1951 /MATERIALS/US2143 /MATERIALS/US2144 pKW710 PKW1952 pKW589 PKW1953 PKW1954 pAC-6 PKW1955 PKW1956 PKW1957 PKW1958 PKW1959 PKW196 pRSET B PKW1960 PKW1961 PKW1962 pDH5 PKW1963 PKW1964 PKW1965 PKW1966 PKW1967 PKW1968 /MATERIALS/US2396 /MATERIALS/US2397 pKW1648 PKW1969 pKW1833 PKW197 pRSET C PKW1970 pKW657 PKW1971 pKW657 PKW1972 pKW1969 PKW1973 PKW1974 /MATERIALS/US2172 /MATERIALS/US2173 pKW656 PKW1975 /MATERIALS/US2172 /MATERIALS/US2173 pKW710 PKW1976 /MATERIALS/US2188 /MATERIALS/US2189 pKW656 PKW1977 /MATERIALS/US2188 /MATERIALS/US2189 pKW710 PKW1978 PKW1979 PKW198 pSG5 PKW1980 PKW1981 /MATERIALS/US2166 /MATERIALS/US2167 pKW348 PKW1982 pKW1954 PKW1983 pKW345 PKW1984 pKW1901 PKW1985 PKW1986 PKW1987 PKW1988 PKW1989 PKW199 pRC/CMV PKW1990 PKW1991 pKW1966 PKW1992 /MATERIALS/US2225 /MATERIALS/US2226 pKW656 PKW1993 /MATERIALS/US2225 /MATERIALS/US2226 pKW710 PKW1994 /MATERIALS/US2225 /MATERIALS/US2226 pKW1965 PKW1995 PKW1996 pKW350 PKW1997 /MATERIALS/US2225 /MATERIALS/US2226 pKW1966 PKW1998 /MATERIALS/US2271 /MATERIALS/US2272 pGEX4T-1 PKW1999 PKW2 PKW20 pUEXI PKW200 pRC/CMV PKW2000 pKW708 PKW2001 pKW1606 PKW2002 /MATERIALS/US2205 /MATERIALS/US2206 pKW1981 PKW2003 /MATERIALS/US2008 /MATERIALS/US2009 pKW1981 PKW2004 pKW657 PKW2005 pKW1455 PKW2006 pKW1833 PKW2007 pKW1833 PKW2008 pKW1833 PKW2009 pKW1833 PKW201 pBluescript SK- PKW2010 pKW1833 PKW2011 pKW1988 PKW2012 pKW2006 PKW2013 pKW2007 PKW2014 pKW2008 PKW2015 pKW2009 PKW2016 pKW2010 PKW2017 pRS305 PKW2018 /MATERIALS/US2271 /MATERIALS/US2272 pKW1954 PKW2019 /MATERIALS/US2285 /MATERIALS/US2286 pKW2000 PKW202 pBluescript SK- PKW2020 pKW1809 PKW2021 pKW1810 PKW2022 pKW2001 PKW2023 /MATERIALS/US2287 /MATERIALS/US2288 pKW2019 PKW2024 PKW2025 pKW2011 PKW2026 pKW1987 PKW2027 pKW1989 PKW2028 PKW2029 PKW203 lafmid BA PKW2030 PKW2031 pKW1788 PKW2032 PKW2033 pKW2024 PKW2034 pET3a PKW2035 pET3a PKW2036 /MATERIALS/US2287 /MATERIALS/US2288 pKW2023 PKW2037 pKW2023 PKW2038 pKW2023 PKW2039 pKW2023 PKW204 pBluescript KS+ PKW2040 pKW2023 PKW2041 pKW2024 PKW2042 pkw1611 PKW2043 PKW2044 pKW1833 PKW2045 pKW657 PKW2046 PKW2047 pKW2044 PKW2048 pKW2044 PKW2049 pKW708 PKW205 pET3a PKW2050 pKW1954 PKW2051 pKW1954 PKW2052 /MATERIALS/US2244 /MATERIALS/US2445 pKW1999 PKW2053 pKW1999 PKW2054 pKW1999 PKW2055 pKW1968 PKW2056 /MATERIALS/US2349 /MATERIALS/US2359 pRS313(pKW347) PKW2057 PKW2058 PKW2059 pKW1833 PKW206 pBSII-KS+ PKW2060 pKW657 PKW2061 /MATERIALS/US2396 /MATERIALS/US2397 pKW1648 PKW2062 pKW2054 PKW2063 pKW2054 PKW2064 PKW2065 pKW2059 PKW2066 pKW2059 PKW2067 pKW1901 PKW2068 PKW2069 PKW207 pBluescript SK- PKW2070 PKW2071 pKW 2064 PKW2072 pKW2064 PKW2073 pKW353 PKW2074 pKW353 PKW2075 pKW353 PKW2076 pKW2074 PKW2077 PKW2078 PKW2079 PKW208 pDS-56H PKW2080 PKW2081 PKW2082 PKW2083 PKW2084 PKW2085 PKW2086 PKW2087 PKW2088 PKW2089 PKW209 pUEXI PKW2090 PKW2091 PKW2092 PKW2093 PKW2094 PKW2095 PKW2096 PKW2097 PKW2098 PKW2099 PKW21 pUEXI PKW210 pUEXI PKW2100 PKW2101 PKW2102 PKW2103 PKW2104 PKW2105 PKW2106 PKW2107 PKW2108 PKW2109 PKW211 pUEXI PKW2110 PKW2111 PKW2112 /MATERIALS/US2515 /MATERIALS/US2516 pKW503 PKW2113 pKW710 PKW2114 pKW2049 PKW2115 pKW2049 PKW2116 pKW2049 PKW2117 PKW2118 PKW2119 PKW212 pUEXI PKW2120 PKW2121 pKW2022 PKW2122 pKW2121 PKW2123 pKW2122 PKW2124 pKW656 PKW2125 /MATERIALS/US2450 /MATERIALS/US2513 pKW2034 PKW2126 /MATERIALS/US2450 /MATERIALS/US2513 pKW2035 PKW2127 pKW1253 PKW2128 PKW2129 PKW213 pUEXI PKW2130 PKW2131 PKW2132 pkw503 PKW2133 pKW2049 PKW2134 PKW2135 PKW2136 PKW2137 pKW606 PKW2138 pKW606 PKW2139 pKW710 PKW214 pUEXI PKW2140 pKW656 PKW2141 /MATERIALS/US2556 /MATERIALS/US2557 pKW1615 PKW2142 /MATERIALS/US2556 /MATERIALS/US2557 pKW1915 PKW2143 /MATERIALS/US2556 /MATERIALS/US2557 pKW1915 PKW2144 /MATERIALS/US2556 /MATERIALS/US2557 pKW1915 PKW2145 pKW2074 PKW2146 pKW2074 PKW2147 pKW2073 PKW2148 pKW2073 PKW2149 pKW1833 PKW215 pUEXI PKW2150 pKW1906 PKW2151 pKW1916 PKW2152 pKW1916 PKW2153 /MATERIALS/US2596 /MATERIALS/US2597 pKW1915 PKW2154 pKW2056 PKW2155 PKW2156 PKW2157 PKW2158 pKW2149 PKW2159 pKW1608 PKW216 pUEXI PKW2160 pRS304 PKW2161 PKW2162 /MATERIALS/US2559 /MATERIALS/US2560 pKW2061 PKW2163 pKW349 PKW2164 pKW1608 PKW2165 pKW1683 PKW2166 pKW1273 PKW2167 pKW656 PKW2168 pKW1683 PKW2169 pKW2073 PKW217 pUEXI PKW2170 pKW2073 PKW2171 pKW2073 PKW2172 pKW2073 PKW2173 pKW1368 PKW2174 pKW589 PKW2175 pKW788 PKW2176 /MATERIALS/US2446 /MATERIALS/US2447 pKW2051 PKW2177 /MATERIALS/US2448 /MATERIALS/US2449 pKW2054 PKW2178 pKW1618 PKW2179 pKW1618 PKW218 pUEXI PKW2180 pKW1618 PKW2181 pKW788 PKW2182 PKW2183 pKW503 PKW2184 pKW1834 PKW2185 pKW503 PKW2186 pKW1834 PKW2187 pKW503 PKW2188 pKW2173 PKW2189 PKW656 PKW219 pUEXI PKW2190 pKW656 PKW2191 pKW1834 PKW2192 pKW2163 PKW2193 pKW2189 PKW2194 pKW2190 PKW2195 PKW2196 PKW2197 pKW2112 (1xDendra) PKW2198 pKW2112 (1xDendra) PKW2199 pKW2197 (2xDendra) PKW22 pUEXI PKW220 pUEXI PKW2200 /MATERIALS/US2663 /MATERIALS/US2688 pKW1459 - pSV271-Nup159 PKW2201 /MATERIALS/US2663 /MATERIALS/US2689 pKW1459 - pSV271-NUP159NTD PKW2202 pkw2132 PKW2203 PKW2204 /MATERIALS/US2609 /MATERIALS/US2611 pkW2197 PKW2205 pKW2198 PKW2206 pKW2199 PKW2207 pKW656 PKW2208 pKW656 PKW2209 pKW1368 PKW221 pUEXI PKW2210 pKW2192 PKW2211 /MATERIALS/US2748 /MATERIALS/US2770 pKW2190 PKW2212 /MATERIALS/US2748 /MATERIALS/US2770 pKW2193 PKW2213 PKW2214 PKW2215 PKW2216 PKW2217 PKW2218 pKW1964 PKW2219 pDONR 221 P1-P5r PKW222 pUEXI PKW2220 pDONR 221 P5 - P4 PKW2221 pDONR 221 P4r - P3 PKW2222 pDONR 221 P3 - P2 PKW2223 pDEST17 PKW2224 PKW2225 PKW2226 PKW2227 PKW2228 PKW2229 PKW223 pUEXI PKW2230 PKW2231 PKW2232 PKW2233 PKW2234 PKW2235 PKW2236 PKW2237 PKW2238 PKW2239 pkw350 PKW224 pUEXI PKW2240 P PKW2241 P PKW2242 P PKW2243 pKW343 PKW2244 pkw2239 PKW2245 pkw2239 PKW2246 pkw2239 PKW2247 pkw2246 PKW2248 pkw2246 PKW2249 pKW606 PKW225 pUEXI PKW2250 PKW2251 PKW2252 PKW2253 PKW2254 PKW2255 PKW2256 PKW2257 PKW2258 PKW2259 PKW226 pUEXI PKW2260 PKW2261 PKW2262 PKW2263 PKW2264 PKW2265 PKW2266 PKW2267 PKW2268 PKW2269 pKW2137 PKW227 pUEXI PKW2270 pKW2225 PKW2271 pKW2228 PKW2272 pKW2230 PKW2273 pKW2230 PKW2274 PKW2275 PKW2276 pKW657 PKW2277 pKW657 PKW2278 pKW657 PKW2279 pKW657 PKW228 pBluescript KS+ PKW2280 PKW2281 PKW2282 PKW2283 PKW2284 pKW503 PKW2285 pKW2284 PKW2286 pKW2284 PKW2287 pKW2284 PKW2288 pKW348 PKW2289 pKW349 PKW229 pKW146 - pSGK-21 PKW2290 pKW2162 PKW2291 /MATERIALS/US2930 /MATERIALS/US2931 pKW2162 PKW2292 /MATERIALS/US1647 /MATERIALS/US2871 pKW1677 PKW2293 pKW2138 PKW2294 pKW629 PKW2295 pKW1833 PKW2296 pKW1833 PKW2297 pKW1833 PKW2298 pKW1938 PKW2299 pKW2295 PKW23 pUEXI PKW230 pRSET B PKW2300 pKW2296 PKW2301 pKW2297 PKW2302 pKW709 PKW2303 pKW1608 PKW2304 pkw2239 PKW2305 2132 PKW2306 pkw2239 PKW2307 PKW2308 pkw2132 PKW2309 pkw2132 PKW231 pRSET B PKW2310 pkw2132 PKW2311 pkw2132 PKW2312 2239 PKW2313 pkw2306 PKW2314 pkw2132 PKW2315 pkw2132 PKW2316 PKW2317 2306 PKW2318 pkw2306 PKW2319 pkw2306 PKW232 pSG8M PKW2320 pkw2306 PKW2321 pkw2304 PKW2322 pkw2304 PKW2323 pkw2304 PKW2324 pkw2304 PKW2325 pkw2304 PKW2326 PKW2173 PKW2327 PKW2207 PKW2328 PKW2208 PKW2329 PKW2327 PKW233 PKW2330 PKW2328 PKW2331 PKW2327 PKW2332 PKW2328 PKW2333 PKW2327 PKW2334 PKW2335 PKW2328 PKW2336 PKW2337 PKW2338 PKW2339 pKW2218 PKW234 PKW2340 pKW2218 PKW2341 PKW2342 pKW980 PKW2343 /MATERIALS/US3066 /MATERIALS/US3068 pKW1954 PKW2344 /MATERIALS/US3066 /MATERIALS/US3067 pKW1954 PKW2345 pKW503 PKW2346 PKW2347 PKW2348 PKW2349 pKW2131 PKW235 pBluescript PKW2350 /MATERIALS/US3078 /MATERIALS/US3079 pKW2131 PKW2351 /MATERIALS/US3081 /MATERIALS/US3082 pKW2240 PKW2352 /MATERIALS/US3081 /MATERIALS/US3082 pKW2218 PKW2353 pKW1834 - pRS GFP-Nup1 PKW2354 pKW2353 - pRS304 Nup1 scr PKW2355 /MATERIALS/US3109 /MATERIALS/US3110 pKW2131 PKW2356 pKW2306 PKW2357 pkw2306 PKW2358 pKW2304 PKW2359 pKW2304 PKW236 pBluescript PKW2360 pKW2304 PKW2361 PKW2362 PKW2363 PKW2364 PKW2365 PKW2366 PKW2367 PKW2368 pKW1316 PKW2369 pKW1316 PKW237 pBluescript PKW2370 pKW1316 PKW2371 pKW1316 PKW2372 pKW1316 PKW2373 pKW1316 PKW2374 pKW1316 PKW2375 pKW1316 PKW2376 /MATERIALS/US3116 /MATERIALS/US3118 pKW1677 - pSV272 Gfd1 PKW2377 /MATERIALS/US3117 /MATERIALS/US3119 pKW1677 - pSV272 Gfd1 PKW2378 /MATERIALS/US3116 /MATERIALS/US3119 pKW1677 PKW2379 /MATERIALS/US3091 /MATERIALS/US3093 pKW2162 PKW238 pBluescript PKW2380 /MATERIALS/US3092 /MATERIALS/US3093 pKW1648 PKW2381 /MATERIALS/US3092 /MATERIALS/US3094 pKW1648 PKW2382 /MATERIALS/US3125 /MATERIALS/US3126 pKW1629 PKW2383 PKW2384 PKW2385 /MATERIALS/US3143 /MATERIALS/US3144 pKW2328 - pFA6a-3xDendra-CaURA3 PKW2386 /MATERIALS/US3151 /MATERIALS/US3152 pKW2328 - pFA6a-3xDendra-CaURA3 PKW2387 pKW1585 PKW2388 pKW1587 PKW2389 pKW1659 PKW239 pBluescript PKW2390 pKW2328 PKW2391 /MATERIALS/US3147 /MATERIALS/US3148 pKW2390 PKW2392 /MATERIALS/US3155 /MATERIALS/US3156 pKW2390 PKW2393 pKW1 PKW2394 PKW2395 pMW172 PKW2396 pGEX-TEV PKW2397 pkw657 PKW2398 pKW2326 PKW2399 pKW2209 PKW24 pUEXI PKW240 pBluescript PKW2400 pRS424 PKW2401 /MATERIALS/US3157 /MATERIALS/US3158 pKW2355 PKW2402 pKW710 PKW2403 pKW710 PKW2404 pKW953 PKW2405 pKW352 PKW2406 pKW352 PKW2407 pKW1809 PKW2408 pKW2407 PKW2409 pKW2407 PKW241 pBluescript PKW2410 /MATERIALS/US3188 /MATERIALS/US3189 pKW656 PKW2411 /MATERIALS/US3188 /MATERIALS/US3189 pKW710 PKW2412 pKW2355 PKW2413 pKW1532 - pET YFP-Impb PKW2414 PKW2415 PKW2416 /MATERIALS/US3194 /MATERIALS/US3195 pKW710 PKW2417 /MATERIALS/US3194 /MATERIALS/US3195 pKW656 PKW2418 /MATERIALS/US3194 /MATERIALS/US3195 pKW710 PKW2419 /MATERIALS/US3194 /MATERIALS/US3195 pKW656 PKW242 pBluescript PKW2420 pKW2304 PKW2421 pkw2312 PKW2422 pkw2313 PKW2423 pKW1964 PKW2424 pKW1964 PKW2425 PKW2426 PKW2427 PKW2428 PKW2429 /MATERIALS/US3267 /MATERIALS/US3268 pKW622 - pCM189 PKW243 pBluescript PKW2430 /MATERIALS/US3267 /MATERIALS/US3268 pKW622 - pCM189 PKW2431 /MATERIALS/US3267 /MATERIALS/US3268 pKW346 - pRS316-G PKW2432 pKW346 - pRS316-G PKW2433 pET3aTr PKW2434 pET3aTr PKW2435 pET3aTr PKW2436 pET3aTr PKW2437 pET3aTr PKW2438 pST39 PKW2439 pKW2438 PKW244 pBluescript PKW2440 pKW2439 PKW2441 pKW2440 PKW2442 pST39 PKW2443 pKW2442 PKW2444 pKW2443 PKW2445 pKW2444 PKW2446 pKW1329 PKW2447 pKW348 PKW2448 pKW1 PKW2449 pKW1 PKW245 pBluescript PKW2450 pKW1 PKW2451 pKW1 PKW2452 pKW1 PKW2453 pKW1 PKW2454 pSV271 PKW2455 pSV271 PKW2456 pSV272 PKW2457 pKW2149 PKW2458 pKW2149 PKW2459 pKW1322 PKW246 pBluescript PKW2460 pKW1322 PKW2461 pKW1322 PKW2462 pKW2149 PKW2463 pKW1446 PKW2464 pKW1446 PKW2465 pSV271 PKW2466 pSV271 PKW2467 pSV271 PKW2468 pSV271 PKW2469 PKW247 pBluescript PKW2470 pET30-a(+) PKW2471 PKW2472 pKW2463 PKW2473 pKW2463 PKW2474 pKW2464 PKW2475 pKW2464 PKW2476 pKW2131 PKW2477 pKW2131 PKW2478 pKW2131 PKW2479 pSV271 PKW248 pBluescript PKW2480 pSV271 PKW2481 pSV271 PKW2482 pSV271 PKW2483 pSV271 PKW2484 pSV271 PKW2485 pSV271 PKW2486 pSV271 PKW2487 pKW2478 PKW2488 PKW2489 PKW249 pBluescript PKW2490 PKW2491 PKW2492 PKW2493 PKW2494 pKW2355 PKW2495 pKW2355 PKW2496 PKW2497 /MATERIALS/US3508 /MATERIALS/US3509 pKW2487 PKW2498 pSV271 PKW2499 pSV271 PKW25 pUEXI PKW250 pBluescript PKW2500 pSV271 PKW2501 pSV271 PKW2502 pKW2327 PKW2503 PKW2328 PKW2504 PKW2505 pkw345 PKW2506 PKW2507 PKW2508 pKW2347 PKW2509 pKW2131 PKW251 pBluescript PKW2510 pKW2131 PKW2511 PKW2512 PKW2513 PKW2514 pKW2487 PKW2515 pKW2437 PKW2516 pKW794 PKW2517 pKW2515 PKW2518 pKW2337 PKW2519 pKW2495 PKW252 pBluescript PKW2520 pKW2495 PKW2521 PKW2522 PKW2523 pKW1669 PKW2524 PKW2525 pkw759 PKW2526 PKW2527 PKW2528 PKW2529 PKW253 pBluescript PKW2530 PKW2531 PKW2532 PKW2533 pKW 1809 PKW2534 pKW760 PKW2535 pKW2460 PKW2536 pKW2487 PKW2537 pKW2327 PKW2538 /MATERIALS/US3729 /MATERIALS/US3730 pKW785(pRS403) PKW2539 /MATERIALS/US3725 /MATERIALS/US3726 pKW2538 PKW254 pBluescript PKW2540 pKW1809 PKW2541 pRS403 PKW2542 PKW347 PKW2543 PKW2544 PKW2545 PKW2546 PKW2547 PKW2548 pKW2327 PKW2549 pKW2487 PKW255 pBluescript PKW2550 PKW2551 PKW2552 PKW2553 PKW2554 pSV271 PKW2555 pSV271 PKW2556 pKW348 PKW2557 pKW348 PKW2558 PKW2559 /MATERIALS/US3518 /MATERIALS/US3785 pKW1322 PKW256 pBluescript PKW2560 /MATERIALS/US3902 /MATERIALS/US3903 pKW760 PKW2561 pKW349 PKW2562 pSV271 PKW2563 pSV271 PKW2564 pSV271 PKW2565 pSV271 PKW2566 pSV271 PKW2567 pSV271 PKW2568 pSV271 PKW2569 pSV271 PKW257 pBluescript PKW2570 pSV272 PKW2571 pKW1759 PKW2572 PKW2573 PKW2574 pKW786 PKW2575 /MATERIALS/US3927 /MATERIALS/US3928 pKW2574 PKW2576 /MATERIALS/US3925 /MATERIALS/US3926 pKW2574 PKW2577 /MATERIALS/US3484 /MATERIALS/US3485 pGEM-T PKW2578 PKW2579 /MATERIALS/US3943 /MATERIALS/US3944 pKW2574 PKW258 pBluescript PKW2580 /MATERIALS/US3518 /MATERIALS/US3916 pKW1322 PKW2581 pKW2548 PKW2582 pKW2548 PKW2583 pKW1322 PKW2584 pKW1322 PKW2585 pKW1322 PKW2586 pKW1322 PKW2587 pKW350(pRS316) PKW2588 pKW350 PKW2589 /MATERIALS/US22 /MATERIALS/US3481 pKW348 (pRS314) PKW259 pBluescript PKW2590 /MATERIALS/US22 /MATERIALS/US3481 pKW348 (pRS314) PKW2591 /MATERIALS/US22 /MATERIALS/US3481 pKW350 (pRS316) PKW2592 /MATERIALS/US22 /MATERIALS/US3481 pKW350 (pRS316) PKW2593 pKW1322 PKW2594 pKW1322 PKW2595 pKW1322 PKW2596 pKW1322 PKW2597 pKW2407 PKW2598 /MATERIALS/US4004 /MATERIALS/US4005 pKW2382 PKW2599 pKW1668 PKW26 pBluescript PKW260 pBluescript PKW2600 pKW2496 PKW2601 /MATERIALS/US4040 /MATERIALS/US4041 pKW2579 PKW2602 pkw2579 PKW2603 PKW2604 PKW2605 from Glick lab PKW2606 PKW2607 PKW2608 PKW2609 PKW261 pBluescript PKW2610 PKW2611 PKW2612 PKW2613 PKW2614 pkw2624 PKW2615 pkw2611 PKW2616 PKW2617 PKW2618 PKW2619 PKW262 pKW259 - p-muscle51 PKW2620 PKW2621 PKW2622 /MATERIALS/US2518 /MATERIALS/US3916 pKW1322 PKW2623 pKW2572 PKW2624 pKW2579 PKW2625 PKW2626 pKW788 PKW2627 pGem-T PKW2628 pKW2583 PKW2629 pKW2583 PKW263 pKW260 - p-muscle62 PKW2630 pKW2583 PKW2631 pKW2412 PKW2632 PKW2633 PKW2634 PKW2635 pKW1459 PKW2636 pKW1459 PKW2637 PKW2638 pKW1669 PKW2639 PKW264 pJN38 PKW2640 pKW1829 PKW2641 pKW1829 PKW2642 pKW2407 PKW2643 pKW2407 PKW2644 /MATERIALS/US4188 /MATERIALS/US4189 pKW2321 PKW2645 /MATERIALS/US4188 /MATERIALS/US4189 pKW2321 PKW2646 /MATERIALS/US4188 /MATERIALS/US4189 pKW2321 PKW2647 /MATERIALS/US4188 /MATERIALS/US4189 pKW2321 PKW2648 PKW2649 pKW1689 PKW265 pKW16 - pNPI-FL PKW2650 pKW1689 PKW2651 pKW1689 PKW2652 PKW2653 /MATERIALS/US4234 /MATERIALS/US4235 pKW1689 PKW2654 /MATERIALS/US4265 /MATERIALS/US4266 pKW1689 PKW2655 PKW2656 PKW2657 PKW2658 pKW760 PKW2659 pKW2658 PKW266 pKW16 - pNPI-FL PKW2660 PKW2661 pKW1008 PKW2662 PKW2663 pKW2662 PKW2664 /MATERIALS/US4372 /MATERIALS/US4373 pKW1689 PKW2665 /MATERIALS/US4376 /MATERIALS/US4377 pKW1689 PKW2666 PKW2667 pKW2131 PKW2668 /MATERIALS/US4236 /MATERIALS/US4237 pKW2572 PKW2669 pKW786 PKW267 pRSET C PKW2670 pKW2460 PKW2671 pKW2460 PKW2672 pKW2670 PKW2673 pKW2670 PKW2674 pKW2670 PKW2675 pKW2670 PKW2676 pKW2487 PKW2677 pKW2487 PKW2678 PKW2679 PKW268 pRSET C PKW2680 pKW2676 PKW2681 pKW350 PKW2682 pKW2487 PKW2683 PKW2684 pKW2682 PKW2685 pFA6a cNLS-yEGFP-HA- pKW2682 PKW2686 pKW2669 PKW2687 PKW2688 pKW2407 PKW2689 /MATERIALS/US4497 /MATERIALS/US4499 pKW1689 PKW269 pBluescript PKW2690 /MATERIALS/US4499 /MATERIALS/US497 pKW1689 PKW2691 pKW2684 PKW2692 pKW2685 PKW2693 PKW2694 /MATERIALS/US4528 /MATERIALS/US4529 pGemT PKW2695 /MATERIALS/US4505 /MATERIALS/US4506 pKW1689 PKW2696 /MATERIALS/US4509 /MATERIALS/US4510 pKW1689 PKW2697 pRS306 PKW2698 pRS314 PKW2699 pRS314 PKW27 pBluescript SK- PKW270 pBluescript PKW2700 pRS314 PKW2701 pUG34 (pRS314-pMET25-GFP) PKW2702 pNH605-pCYC1 PKW2703 /MATERIALS/US4507 /MATERIALS/US4508 pKW1689 PKW2704 /MATERIALS/US4513 /MATERIALS/US4514 pKW1689 PKW2705 /MATERIALS/US4586 /MATERIALS/US4587 pKW2668 PKW2706 pKW2459 PKW2707 pKW2669 PKW2708 pKW760 PKW2709 pKW2638 PKW271 pKW269 - pYMP90A PKW2710 PKW2711 PKW2712 PKW2713 PKW2714 pKW1669 PKW2715 pKW1669 PKW2716 pKW2546 PKW2717 pkw354 PKW2718 pkw354 PKW2719 pkw354 PKW272 pKW270 - pYMP90B PKW2720 pkw354 PKW2721 760 PKW2722 760 PKW2723 pFA6a-GFP-KanMx6 PKW2724 pFA6a-GFP-TRP1 PKW2725 pFA6a-GFP-HisMx6 PKW2726 pKW2585 PKW2727 pKW2326 PKW2728 PKW2729 PKW273 pKW264 - pJN38 PKW2730 PKW2731 PKW2732 pKW2487 PKW2733 pKW2487 PKW2734 pKW2705 PKW2735 pRS304 PKW2736 pKW760 PKW2737 pKW760 PKW2738 PKW2739 PKW274 pKW264 - pJN38 PKW2740 PKW2741 yCPlac22 PKW2742 yCPlac22 PKW2743 pFA6a PKW2744 pFA6a PKW2745 pFA6a PKW2746 pFA6a PKW2747 PKW2748 PKW2749 pKW1669 PKW275 pKW202 - HS5543 PKW2750 pKW1669 PKW2751 /MATERIALS/US4674 /MATERIALS/US4675 pKW2626 PKW2752 pkw760 PKW2753 PKW2754 PKW2755 PKW2756 PKW2757 PKW2758 pKW785 PKW2759 PKW276 pKW275 - pIMP90 PKW2760 PKW2761 PKW2762 PKW2763 PKW2764 PKW2765 PKW2766 PKW2767 pKW 2207 PKW2768 /MATERIALS/US4685 /MATERIALS/US4686 pkw2538 PKW2769 /MATERIALS/US4683 /MATERIALS/US4684 pkw1987 PKW277 pSG5 PKW2770 PKW2771 PKW2772 pKW1322 PKW2773 PKW2774 PKW2775 PKW2776 PKW2777 1689 PKW2778 pkw2541 PKW2779 PKW278 pKW163 - pEG202+4 PKW2780 1689 PKW2781 PKW2782 PKW2783 PKW2784 PKW2785 PKW2786 PKW2787 PKW2788 PKW2789 PKW279 pKW278 - pEG IMP90 -1 PKW2790 PKW2791 PKW2792 pkw2312 PKW2793 pkw2312 PKW2794 PKW2795 PKW2796 PKW2797 PKW2798 PKW2799 pkw2792 PKW28 pBluescript SK- PKW280 pKW278 - pEG IMP90 -1 PKW2800 pkw2799 PKW2801 PKW2802 PKW2803 PKW2804 PKW2805 PKW2806 PKW2807 pKW1330 PKW2808 pKW1330 PKW2809 pKW1330 PKW281 pRSET A PKW2810 pKW1330 PKW2811 pKW1324 PKW2812 pKW1324 PKW2813 PKW2814 PKW2815 pKW2806 PKW2816 pKW2806 PKW2817 pkw786 PKW2818 pkw1689 PKW2819 786 PKW282 pQE60 PKW2820 1689 PKW2821 pKW2809 PKW2822 pKW2810 PKW2823 pKW1330 PKW2824 pkw2244 PKW2825 PKW2826 PKW2827 pkw2825 PKW2828 PKW2829 PKW283 pKW208 - pDS-ASF1 PKW2830 PKW2831 PKW2832 /MATERIALS/US4896 /MATERIALS/US4897 pKW1689 PKW2833 PKW2834 PKW2835 PKW2836 /MATERIALS/US3943 /MATERIALS/US4901 pKW787 PKW2837 /MATERIALS/US4155 /MATERIALS/US4766 pKW2526 PKW2838 PKW2839 PKW284 pKW208 - pDS-ASF1 PKW2840 PKW2841 PKW2842 PKW2843 PKW2844 PKW2845 PKW2846 /MATERIALS/US4896 /MATERIALS/US4898 pKW2526 PKW2847 PKW2848 PKW2849 PKW285 pJG4-5 PKW2850 PKW2851 pKW2207 PKW2852 PKW2853 PKW2854 pkw2820 PKW2855 2817 PKW2856 kwy2722 PKW2857 PKW2858 PKW2859 PKW286 pJG4-5 PKW2860 pKW1669 PKW2861 PKW2862 PKW2863 PKW2864 pKW2321 PKW2865 pKW2864 PKW2866 pKW2865 PKW2867 pKW2312 PKW2868 PKW2869 PKW287 pJG4-5 PKW2870 PKW2871 PKW2872 PKW2873 PKW2874 PKW2875 PKW2876 PKW2877 PKW2878 PKW2879 PKW288 pEG202 PKW2880 PKW2881 PKW2882 PKW2883 PKW2884 pKW001 PKW2885 pKW804 PKW2886 PKW2887 PKW2888 PKW2889 PKW289 pEG202 PKW2890 PKW2891 PKW2892 PKW2893 PKW2894 PKW2895 PKW2896 PKW2897 pKW1324 PKW2898 pKW1324 PKW2899 pKW2173 PKW29 pKW30 - pC‰ö BamHI PKW290 pQE60 PKW2900 PKW2901 PKW2902 pKW2900 PKW2903 pKW2901 PKW2904 PKW2905 2526 PKW2906 2526 PKW2907 PKW2908 PKW2909 PKW291 pQE60 PKW2910 PKW2911 PKW2912 PKW2913 PKW2914 PKW2915 PKW2916 PKW2917 PKW2918 pKW1358 PKW2919 pKW2885 PKW292 pQE60 PKW2920 pKW2576 PKW2921 PKW2922 PKW2923 pKW803 PKW2924 pKW804 PKW2925 pKW2904 PKW2926 pKW2904 PKW2927 PKW2928 PKW2929 PKW293 pQE60 PKW2930 PKW2931 PKW2932 PKW2933 pKW2926 PKW2934 pKW2888 PKW2935 pKW2888 PKW2936 pKW2860 PKW2937 pKW2859 PKW2938 pKW2902 PKW2939 pKW2903 PKW294 pRSET B PKW2940 pRS404 PKW2941 pkw348 PKW2942 pkw2941 PKW2943 pkw2420 PKW2944 pkw2321 PKW2945 PKW2946 PKW2947 PKW2948 PKW2949 PKW295 pET3d PKW2950 pkw2949 PKW2951 /MATERIALS/US2205 /MATERIALS/US3436 2312 PKW2952 2312 PKW2953 2312 PKW2954 2421 PKW2955 2421 PKW2956 PKW2957 PKW2958 pKW1 PKW2959 pKW1 PKW296 PKW2960 pKW1 PKW2961 pKW1 PKW2962 PKW2963 PKW2964 PKW2965 PKW2966 PKW2967 PKW2968 PKW2969 PKW297 pKW275 - pIMP90 PKW2970 PKW2971 PKW2972 PKW2973 pKW2727 PKW2974 PKW2975 PKW2976 PKW2977 PKW2978 PKW2979 pKW2409 PKW298 pGEX-CS PKW2980 PKW2981 /MATERIALS/US5470 /MATERIALS/US5471 pKW1008 PKW2982 PKW2983 PKW2984 pkw2949 PKW2985 pKW001 PKW2986 pKW001 PKW2987 pKW2459 PKW2988 pKW2459 PKW2989 pKW2979 PKW299 pKW297 - pBS Ran PKW2990 pKW2979 PKW2991 pKW2979 PKW2992 PKW2993 PKW2994 PKW2995 PKW2996 PKW2997 PKW2998 PKW2999 PKW3 pGEX-2T PKW30 pKW28 - pC PKW300 pKW291 - pQE IMP90 PKW3000 /MATERIALS/US2372 /MATERIALS/US5283 pSV271 PKW3001 /MATERIALS/US2372 /MATERIALS/US5283 pSV271 PKW3002 /MATERIALS/US2372 /MATERIALS/US5283 pSV271 PKW3003 /MATERIALS/US2372 /MATERIALS/US5283 pSV271 PKW3004 PKW3005 pRS414 PKW3006 pRS414 PKW3007 2918 PKW3008 pkw1689 PKW3009 1689 PKW301 pRSET B PKW3010 PKW3011 PKW3012 PKW3013 PKW3014 pKW001 PKW3015 pKW001 PKW3016 pKW001 PKW3017 pKW001 PKW3018 pKW001 PKW3019 pKW 760 PKW302 pRSET B PKW3020 /MATERIALS/US5659 /MATERIALS/US5660 pKW2495 PKW3021 PKW3022 PKW3023 PKW3024 PKW3025 PKW3026 PKW3027 PKW3028 /MATERIALS/US5657 /MATERIALS/US5658 pKW2837 PKW3029 /MATERIALS/US5657 /MATERIALS/US5658 pKW2837 PKW303 pGEX-CS PKW3030 pKW2727 PKW3031 pKW2727 PKW3032 pKW2707 PKW3033 pKW2707 PKW3034 pKW760 PKW3035 PKW3036 PKW3037 pKW3023 PKW3038 pKW001 PKW3039 pKW001 PKW304 pGEX-2T PKW3040 pkw2867 PKW3041 pNH605 (pLC130) PKW3042 pNH605 (pLC130) PKW3043 pNH605 (pLC130) PKW3044 pKW3020 PKW3045 pKW2738 PKW3046 pKW804 PKW3047 pKW2407 PKW3048 pKW3046 PKW3049 pKW2707 PKW305 pT7T3 PKW3050 PKW3051 PKW3052 PKW3053 pKW3048 PKW3054 pKW2407 PKW3055 pKW2407 PKW3056 PKW3057 PKW3058 pKW350 (pRS316) PKW3059 pEGFP-C1 PKW306 pBluescript SK- PKW3060 pKW708 PKW3061 PKW3062 PKW3063 pKW3021 PKW3064 pKW3022 PKW3065 pKW953 PKW3066 pkw2312 PKW3067 pkw2321 PKW3068 pkw2421 PKW3069 pkw2312 PKW307 pKW295 - pET Ran PKW3070 pkw2321 PKW3071 PKW3072 pkw3066 PKW3073 pkw3067 PKW3074 pkw3068 PKW3075 pcDNA3.1 PKW3076 PKW3077 PKW3078 PKW3079 PKW308 pBluescript KS+ PKW3080 /MATERIALS/US5746 /MATERIALS/US5747 pGEM PKW3081 /MATERIALS/US5746 /MATERIALS/US5747 pGEM PKW3082 /MATERIALS/US5659 /MATERIALS/US5842 pKW1008 PKW3083 /MATERIALS/US5575 /MATERIALS/US5576 pKW3013 PKW3084 /MATERIALS/US5775 /MATERIALS/US5776 pKW3013 PKW3085 /MATERIALS/US5775 /MATERIALS/US5776 pKW3013 PKW3086 /MATERIALS/US5775 /MATERIALS/US5776 pKW3013 PKW3087 /MATERIALS/US5775 /MATERIALS/US5776 pKW3013 PKW3088 PKW3089 PKW309 pGEM5 PKW3090 PKW3091 PKW3092 PKW3093 pKW3057 PKW3094 pLC10 (pFA6a-KANmx6-pGAL1-3HA) PKW3095 PKW3096 pkw3095 PKW3097 pkw3095 PKW3098 PKW3099 PKW31 pKW29 - pC24 PKW310 PKW3100 PKW3101 PKW3102 pKW3602 PKW3103 3102 PKW3104 PKW3105 pKW3012 PKW3106 pKW3013 PKW3107 3102 PKW3108 pKW709 PKW3109 PKW311 pBluescript PKW3110 PKW3111 PKW3112 PKW3113 PKW3114 PKW3115 PKW3116 PKW3117 PKW3118 pKW3115 PKW3119 pKW3024 PKW312 pRSET A PKW3120 pKW3116 PKW3121 pKW3117 PKW3122 PKW3123 PKW3124 pKW788 PKW3125 pKW3059 PKW3126 pkw2421 PKW3127 pkw2421 PKW3128 pKW2321 PKW3129 pKW2321 PKW313 pRSET C PKW3130 PKW3131 PKW3132 PKW3133 PKW3134 PKW3135 pKW1008 PKW3136 pKW349 PKW3137 pKW349 PKW3138 pKW349 PKW3139 pKW349 PKW314 pKW312 - pRSET SRP-N PKW3140 PKW3141 pKW349 PKW3142 PKW3143 /MATERIALS/US3482 /MATERIALS/US6051 pKW350 PKW3144 PKW3145 PKW3146 PKW3147 /MATERIALS/US6033 pKW3028 PKW3148 pKW350 PKW3149 /MATERIALS/US6056 /MATERIALS/US6057 pKW3173 PKW315 pRSET C PKW3150 /MATERIALS/US6058 /MATERIALS/US6059 pKW3173 PKW3151 PKW3152 PKW3153 pKW3148 PKW3154 pKW3148 PKW3155 PKW3156 PKW3157 pKW3023 PKW3158 pKW3158 PKW3159 PKW316 PKW3160 PKW3161 PKW3162 pKW3021 PKW3163 PKW3164 pKW3023 PKW3165 pKW3023 PKW3166 pKW3023 PKW3167 pKW3148 PKW3168 pKW3148 PKW3169 pKW3148 PKW317 pSM56 PKW3170 pKW3148 PKW3171 PKW3172 pKW2837 PKW3173 /MATERIALS/US6052 /MATERIALS/US6053 pKW3143 PKW3174 /MATERIALS/US6054 /MATERIALS/US6055 pKW3143 PKW3175 pFA6a-KanMx6-pMET3-URL-3HA PKW3176 /MATERIALS/US6056 /MATERIALS/US6057 pKW3174 PKW3177 pkw2724 PKW3178 pkw2724 PKW3179 PKW318 pKW317 - pSM56 SRPb -1 PKW3180 PKW3181 PKW3182 PKW3183 PKW3184 PKW3185 PKW3186 PKW3187 PKW3188 PKW3189 PKW319 pKW312 - pRSET SRP-N PKW3190 PKW3191 PKW3192 PKW3193 PKW3194 PKW3195 PKW3196 PKW3197 PKW3198 PKW3199 PKW32 PKW320 pKW312 - pRSET SRP-N PKW3200 PKW3201 PKW3202 /MATERIALS/US6058 /MATERIALS/US6059 pKW3174 PKW3203 PKW3204 PKW3205 pKW3023 PKW3206 PKW3207 PKW3208 PKW3209 PKW321 pRSET C PKW3210 PKW3211 PKW3212 PKW3213 PKW3214 PKW3215 PKW3216 PKW3217 pNH605(XbaI)-pCYC1-3V5 PKW3218 pNH605(XbaI)-pCYC1-3V5 PKW3219 pNH605(XbaI)-pCYC1-3V5-IAA7 (pKW3217) PKW322 pRSET C PKW3220 pKW3021 PKW3221 pKW3021 PKW3222 pKW3021 PKW3223 pKW3021 PKW3224 pKW3021 PKW3225 pKW3218-pMET3-URL-3V5 PKW3226 pKW3219-pMET3-3V5-IAA7 PKW3227 pKW3218-pMET3-URL-3V5 PKW3228 pKW3219-pMET3-3V5-IAA7 PKW3229 PKW323 pBluescript KS+ PKW3230 PKW3231 pKW3229 PKW3232 PKW3233 pKW3229 PKW3234 pKW3230 PKW3235 pKW3229 PKW3236 pKW3235 PKW3237 pKW3235 PKW3238 pKW3231 PKW3239 pKW3232 PKW324 pRSET C PKW3240 pKW3231 PKW3241 pKW3232 PKW3242 PKW3243 PKW3244 pKW2544 PKW3245 PKW3246 PKW3247 pKW3150 PKW3248 pKW3150 PKW3249 pKW3054 PKW325 pKW313 - pRSET SRP-C PKW3250 pKW3054 PKW3251 Westermann et al. PKW3252 Westermann et al. PKW3253 Westermann et al PKW3254 pKW2937 PKW3255 pKW2938 PKW3256 pKW3048 PKW3257 pKW3179 PKW3258 pKW3048 PKW3259 pKW3179 PKW326 pRSET C PKW3260 PKW3261 pKW3240 PKW3262 pVT100U (Westermann et al.) PKW3263 PL-452 PKW3264 /MATERIALS/CH106 /MATERIALS/CH6 pKW1689 PKW3265 /MATERIALS/CH106 /MATERIALS/CH6 pKW1689 PKW3266 pMA PKW3267 PKW3268 pKW2327 PKW3269 pKW2327 PKW327 pRSET C PKW3270 PKW3271 PKW3272 pKW2546 PKW3273 pKW2546 PKW3274 pKW2546 PKW3275 pKW2546 PKW3276 pKW2546 PKW3277 pKW2546 PKW3278 pKW2546 PKW3279 pKW2546 PKW328 pRSET C PKW3280 PKW3281 PKW3282 PKW3283 PKW3284 PKW3285 PKW3286 PKW3287 pKW3251 PKW3288 pKW3251 PKW3289 pKW3251 PKW329 PKW3291 PKW3293 PKW3294 PKW3295 PKW3296 PKW3297 pRS306 PKW3298 PKW3299 pKW3236 PKW33 pBluescript KS- PKW330 PKW3300 pKW3293 PKW3301 PKW3302 PKW3303 PKW3304 PKW3305 PKW3306 PKW3307 pKW3304 PKW3308 PKW3309 PKW331 p PKW3310 pKW3279 PKW3311 pYB1372 PKW3312 pKW788 PKW3313 pYB1602 PKW3317 pYB1372 PKW3318 pKW3401 PKW3319 PKW332 YEp51 PKW3320 pKW3307 PKW3321 pkw2312 PKW3322 pkw2312 PKW3323 pkw2312 PKW3324 pkw2312 PKW3325 pkw3321 PKW3326 pkw3321 PKW3327 pkw3321 PKW3328 pkw3323 PKW3329 pkw3323 PKW333 pEG202 PKW3330 pkw3326 PKW3331 pkw3326 PKW3332 pkw3328 PKW3333 pkw3331 PKW3334 pkw3326 PKW3335 pkw3327 PKW3336 pkw3324 PKW3337 pkw2421 PKW3338 pkw2421 PKW3339 pkw2421 PKW334 pEG202 PKW3340 pkw2421 PKW3341 pkw3337 PKW3342 pkw3337 (?) PKW3343 pkw3337 PKW3344 pkw3339 PKW3345 pkw3339 PKW3346 pkw3342 (?) PKW3347 pkw3342 (?) PKW3348 pkw3344 PKW3349 pkw3347 PKW335 pEG202 PKW3350 pkw3340 PKW3351 pkw2321 PKW3352 pkw2321 PKW3353 pkw2321 PKW3354 pkw2321 PKW3355 PKW3356 PKW3357 PKW3358 PKW3359 PKW336 pJG4-5 PKW3360 PKW3361 PKW3362 PKW3363 PKW3364 PKW3365 PKW3366 PKW3367 PKW3368 PKW3369 PKW337 pJG4-5 PKW3370 PKW3372 pKW2544 PKW3373 PKW350 PKW3374 pkw3291 PKW3377 pKW3256 PKW3378 pKW3257 PKW3379 pKW3249 PKW338 pJG4-5 PKW3380 pKW3250 PKW3381 pKW3048 PKW3382 pKW3179 PKW3383 pKW2327 PKW3384 pKW2327 PKW3385 pKW2327 PKW3386 pKW3363-pKW3355 PKW3387 pKW3372 PKW3388 pKW3372 PKW3389 pKW3372 PKW339 PKW3390 pKW3372 PKW3391 pKW3372 PKW3392 pKW3372 PKW3393 pKW3372 PKW3394 pKW3372 PKW3395 pKW3372 PKW3396 /MATERIALS/CH470 pKW3478 PKW3397 pKW2888 PKW3398 pKW3279 PKW34 PKW340 PKW3401 /MATERIALS/CH271 pKW3317 PKW3402 pKW2218 PKW3403 pKW3136 PKW3404 pKW1703 PKW3405 pKW2544 PKW3406 pKW2207 PKW3407 pKW2327 PKW3408 pKW3386 PKW3409 pKW3320 PKW341 PKW3410 pKW1424 PKW3411 pKW1144 PKW3412 PKW3413 pKW3235 PKW3414 /MATERIALS/CH271 /MATERIALS/CH310 pKW3279 PKW3415 pKW787 PKW3416 pKW787 PKW3417 /MATERIALS/CH275 /MATERIALS/CH278 pYB1372 PKW3418 /MATERIALS/CH309 /MATERIALS/CH310 pKW3398 PKW3419 pKW3377 PKW342 pRSET C PKW3420 pKW3377 PKW3421 pKW3377 PKW3422 pKW3377 PKW3423 pKW3379 PKW3424 pKW3379 PKW3425 pKW3379 PKW3426 pKW3379 PKW3427 pKW2424 PKW3428 pKW2424 PKW3429 pKW2424 PKW343 PKW3430 pKW3377 PKW3431 pKW3378 PKW3433 pKW3394 PKW3434 pKW3408 PKW3435 pKW3434 PKW3437 PKW3438 PKW3439 PKW344 PKW3440 PKW3441 pKW2306 PKW3443 pKW2306 PKW3444 pKW3372 PKW3445 /MATERIALS/CH485 /MATERIALS/CH487 pKW3282 PKW3446 pKW3293 PKW3447 pKW3293 PKW3448 /MATERIALS/CH514 /MATERIALS/CH515 pKW3281 PKW3449 /MATERIALS/CH414 /MATERIALS/CH415 pKW3282 PKW345 PKW3450 pKW3447 PKW3451 pKW3427 PKW3452 pKW3428 PKW3453 pKW3429 PKW3454 pKW3446 PKW3456 /MATERIALS/CH546 /MATERIALS/CH547 pKW3448 PKW3457 /MATERIALS/CH546 /MATERIALS/CH547 pKW3449 PKW3458 /MATERIALS/CH546 /MATERIALS/CH547 pKW3281 PKW3459 /MATERIALS/CH546 /MATERIALS/CH547 pKW3282 PKW346 PKW3460 pKW3435 PKW3461 pKW3293 PKW3462 pKW3293 PKW3463 pKW2626 PKW3464 pKW001 PKW3465 pKW001 PKW3466 pKW001 PKW3467 pKW3435 PKW3468 pKW3435 PKW3469 pKW3293 PKW347 PKW3470 pKW3461 PKW3471 pKW2686 PKW3473 pKW2326 PKW3474 pKW2686 PKW3475 pkw3333 PKW3476 pkw3333 PKW3477 pkw2866 PKW3478 /MATERIALS/CH469 /MATERIALS/CH470 pKW2550 PKW3479 /MATERIALS/CH278 pYB1372 PKW348 PKW3480 /MATERIALS/CH109 /MATERIALS/CH213 pKW787 PKW3481 /MATERIALS/CH279 /MATERIALS/CH290 pRS406 PKW3482 PKW3483 pkw3333 PKW3484 pkw3333 PKW3486 pKW3302 PKW3487 pkw3475 PKW3488 pkw3333 PKW3489 pkw3461 PKW349 PKW3490 pkw3461 PKW3491 pkw2967 PKW3492 pkw2968 PKW3493 pkw2969 PKW3494 pkw3004 PKW3495 pkw3005 PKW3496 pkw3006 PKW3497 PKW3498 PKW3499 PKW35 PKW350 PKW3500 PKW3501 pKW3433 PKW3502 pKW3467 PKW3503 pKW3467 PKW3504 /MATERIALS/CH482 pKW1803 PKW3505 pkw3488 PKW3506 pkw3488 PKW3507 pkw3505 PKW3508 PKW3509 PKW351 PKW3510 PKW3511 PKW3512 PKW3513 PKW3514 PKW3515 PKW3516 PKW3517 pkw3461 PKW3518 pkw3461 PKW3519 pKW3388 PKW352 PKW3520 pKW2579 PKW3521 PKW3522 PKW3523 PKW3524 PKW3525 PKW3526 PKW3527 PKW3528 pKW2686 PKW3529 pKW3388 (CEN) PKW353 PKW3530 pKW3388 (CEN) PKW3531 PKW3532 /MATERIALS/CH271 /MATERIALS/CH290 pKW3297 PKW3533 PKW3534 PKW3535 PKW3536 PKW3537 PKW3538 PKW3539 pKW2208 PKW354 PKW3540 PKW3541 PKW3542 pKW2208 PKW3543 pkw3517 PKW3544 pkw3517 PKW3545 pkw3126 PKW3546 pkw3126 PKW3547 PKW3548 pKW3154 PKW3549 pKW2899 PKW355 pKW313 - pRSET SRP-C PKW3550 pkw3543 PKW3551 pkw3453 PKW3552 /MATERIALS/CH781 /MATERIALS/CH782 pKW759 PKW3553 /MATERIALS/CH807 /MATERIALS/CH808 pKW759 PKW3554 PKW3555 PKW3556 pKW3528 PKW3557 pKW3528 PKW3558 pKW3528 PKW3559 pKW3528 PKW356 pQE32 PKW3560 pKW3528 PKW3561 pKW2899 PKW3562 pKW3407 PKW3563 pKW3435 PKW3564 pKW3435 PKW3565 pKW3435 PKW3566 pKW3435 PKW3567 pKW3406 PKW3568 pKW3407 PKW3569 pKW2124 PKW357 pKW356 - pQE Ran PKW3570 pKW2207 PKW3571 PKW3572 pKW589 PKW3573 pKW589 PKW3574 pKW2575 PKW3575 pKW2575 PKW3576 PKW3577 PKW3578 PKW3579 pKW3529 PKW358 PKW3580 pKW3529 PKW3581 pKW3529 PKW3582 pKW3529 PKW3583 pKW3416 PKW3584 pKW3562 PKW3585 pKW3401 PKW3586 pKW3417 PKW3587 pKW3532 PKW3588 PKW3589 PKW359 PKW3590 PKW3591 pKW3580 PKW3592 pKW3569 PKW3593 pKW3569 PKW3594 pKW2124 PKW3595 pKW2124 PKW3596 pKW3398 PKW3597 PKW3598 pKW3529 PKW3599 pKW3447 PKW36 pSG5 PKW360 PKW3600 pKW3576 PKW3601 pKW3577 PKW3602 pKW3596 PKW3603 pKW2591 PKW3604 pKW3293 PKW3605 pKW3503 PKW3606 pKW3501 PKW3607 pKW3579 PKW3608 PKW3609 PKW361 PKW3610 pKW3398 PKW3611 PKW3612 pKW3582 PKW3613 pKW3597 PKW3614 pKW3562 + pKW2744 PKW3615 pKW3562 + pKW3525 PKW3616 pKW3572 + pKW3404 PKW3617 pKW2421 PKW3618 pKW2422 PKW3619 pKW3293 PKW362 PKW3620 pKW3293 PKW3621 pKW3293 PKW3622 PKW3623 PKW3624 pkw2321 PKW3625 pkw2321 PKW3626 pKW3611 PKW3627 PKW3628 PKW3629 pKW3611 PKW363 PKW3630 PKW3631 pKW3461 PKW3632 pKW3470 PKW3633 pKW3461 PKW3634 pKW3461 PKW3635 pKW3470 PKW3636 pHCA/GAL4 (848). ER pRS306 PKW3637 PKW350 PKW3638 pKW350 PKW3639 pKW3470 PKW364 PKW3640 pKW3470 PKW3641 pKW3630 PKW3642 pKW3630 PKW3643 pKW3381 PKW3644 pKW3471 PKW3645 pKW3474 PKW3646 pKW3461 PKW365 PKW366 PKW367 PKW368 PKW369 PKW37 pKW36 - pSG5-C24 PKW370 PKW371 PKW372 pQE70 PKW373 pQE70 PKW374 pBluescript SK+ PKW375 pGEX-2T PKW376 pRSET A PKW377 pRSET A PKW378 PKW379 PKW38 pRSET B PKW380 PKW381 PKW382 PKW383 /MATERIALS/US1 /MATERIALS/US2 pKW348 - pRS314 PKW384 pKW230 - pRSET XCons PKW385 pKW15 - pVT202-U PKW386 /MATERIALS/US3 /MATERIALS/US4 pKW383 - pRS-LexA PKW387 pKW386 - pRSLexA-B42-HA PKW388 pKW386 - pRSLexA-B42-HA PKW389 pKW344 - pRS314-G PKW39 pKW29 - pC24 PKW390 pKW345 - pRS315 G PKW391 pKW343 - pRS313 G PKW392 /MATERIALS/US1 /MATERIALS/US2 pKW354 - pRS426 PKW393 pKW352 - pRS424 PKW394 /MATERIALS/US15 /MATERIALS/US16 pKW393 - pRS424 (G) PKW395 pT7T3 PKW396 pBluescript SK PKW397 pT7T3D PKW398 pT7T3D PKW399 pGEM-3Z (modified) PKW4 pSG5 PKW40 pJG4-5 PKW400 pGEM-3Z modified PKW401 /MATERIALS/US17 pKW387 - pRS386-NES PKW402 /MATERIALS/US17 pKW388 - pRS386-P12 PKW403 /MATERIALS/US17 pKW401 - pNES-cGFP PKW404 /MATERIALS/US17 pKW402 - pP12-cGFP PKW405 PKW406 /MATERIALS/US11 /MATERIALS/US13 pKW321 - pRSET bGal PKW407 /MATERIALS/US11 /MATERIALS/US14 pKW321 - pRSET bGal PKW408 /MATERIALS/US12 /MATERIALS/US14 pKW321 - pRSET bGal PKW409 /MATERIALS/US21 /MATERIALS/US22 pKW387 - pRS386-NES PKW41 pJG4-5 PKW410 /MATERIALS/US21 /MATERIALS/US22 pKW388 - pRS386-P12 PKW411 pKW351 - pRS423 PKW412 pKW354 - pRS426 PKW413 pKW411 - pRS423-Gal PKW414 pKW411 - pRS423-Gal PKW415 pKW412 - pRS426-Gal PKW416 pKW412 - pRS426-Gal PKW417 pKW415 - p426NLS-GFP-NES PKW418 pKW416 - p426NLS-GFP-P12 PKW419 pBluescript KS- PKW42 pJG4-5 PKW420 PKW421 pKW351 - pRS423 PKW422 pKW394 - pProie PKW423 pKW394 - pProie PKW424 /MATERIALS/US23 /MATERIALS/US24 pKW417 - pAdhNLS-GFP-NES PKW425 /MATERIALS/US23 /MATERIALS/US24 pKW417 - pAdhNLS-GFP-NES PKW426 pKW343 - pRS313-G PKW427 /MATERIALS/US27 /MATERIALS/US28 pKW387 - pRS386-NES PKW428 /MATERIALS/US27 /MATERIALS/US28 pKW387 - pRS386-NES PKW429 pCMV4 PKW43 pJG4-5 PKW430 /MATERIALS/US21 /MATERIALS/US25 pKW417 - pAdhNLS-GFP-NES PKW431 /MATERIALS/US21 /MATERIALS/US25 pKW418 - pAdhNLS-GFP-P12 PKW432 pKW352 - pRS424 PKW433 pKW352 - pRS424 PKW434 pBS KS+ GFP PKW435 pKW434 - pBS CRM1-GFPts PKW436 YCP50 PKW437 pKW434 - pBS CRM1-GFPts PKW438 /MATERIALS/US29 pKW343 - pRS313-G PKW439 /MATERIALS/US29 pKW343 - pRS313-G PKW44 pJG4-5 PKW440 /MATERIALS/US29 pKW347 - pRS313 PKW441 /MATERIALS/US29 pKW347 - pRS313 PKW442 /MATERIALS/US29 pKW158 - pEG202 PKW443 pKW392 - pAppat PKW444 pKW392 - pAppat PKW445 pKW392 - pAppat PKW446 pKW392 - pAppat PKW447 pKW392 - pAppat PKW448 pKW392 - pAppat PKW449 PKW45 pJG4-5 PKW450 PKW451 /MATERIALS/US22 /MATERIALS/US30 pKW352 - pRS424 PKW452 /MATERIALS/US22 /MATERIALS/US31 pKW344 - pRS314-G PKW453 pKW452 - pIBB-GFP-B42 PKW454 pKW392 - pAppat PKW455 pBS-GFP PKW456 pKW347 - pRS313 PKW457 pKW456 - pRS-crm1-1-GFP PKW458 pBluescript SK- PKW459 pKW394 - pProie PKW46 pJG4-5 PKW460 LR1Del1 PKW461 LR1Del1 PKW462 /MATERIALS/US12 /MATERIALS/US14 pKW392 - pAppat PKW463 pKW415 - p426NLS-GFP-NES PKW464 pKW415 - p426NLS-GFP-NES PKW465 pBS KS+ GFP PKW466 YCP50 PKW467 pKW347 - pRS313 PKW468 pKW347 - pRS313 PKW469 pKW394 - pProie PKW47 pJG4-5 PKW470 pKW347 - pRS313 PKW471 pKW164 - pJG4-5 PKW472 pKW158 - pEG202 PKW473 pKW158 - pEG202 PKW474 /MATERIALS/US42 /MATERIALS/US43 pKW158 - pEG202 PKW475 pKW164 - pJG4-5 PKW476 PKW477 YCP50 PKW478 /MATERIALS/US29 pKW346 - pRS316-G PKW479 /MATERIALS/US44 /MATERIALS/US45 pKW392 - pAppat PKW48 pJG4-5 PKW480 /MATERIALS/US46 /MATERIALS/US47 pKW392 - pAppat PKW481 /MATERIALS/US44 /MATERIALS/US45 pKW321 - pRSET bGal PKW482 /MATERIALS/US46 /MATERIALS/US47 pKW321 - pRSET bGal PKW483 pKW472 - pEG GFP-NES PKW484 pKW473 - pEG GFP-P12 PKW485 pET30-a(+) PKW486 PKW487 PKW488 pKW485 - pET p97 PKW489 PKW49 pJG4-5 PKW490 PKW491 pBluescript PKW492 pKW158 - pEG202 PKW493 pKW158 - pEG202 PKW494 pKW158 - pEG202 PKW495 pKW158 - pEG202 PKW496 pKW158 - pEG202 PKW497 pKW164 - pJG4-5 colony PKW498 pKW164 - pJG4-5 colony PKW499 /MATERIALS/US50 /MATERIALS/US51 pKW417 - pAdhNLS-GFP-NES PKW5 pSG5 PKW50 pJG4-5 PKW500 /MATERIALS/US52 /MATERIALS/US53 pKW417 - pAdhNLS-GFP-NES PKW501 /MATERIALS/US50 /MATERIALS/US51 pKW158 - pEG202 PKW502 /MATERIALS/US52 /MATERIALS/US53 pKW158 - pEG202 PKW503 PKW504 /MATERIALS/US48 /MATERIALS/US49 pKW467 - pRS CRM1-A1 PKW505 /MATERIALS/US48 /MATERIALS/US49 pKW468 - pRS CRM1-A2 PKW506 /MATERIALS/US34 /MATERIALS/US36 pBluescript KS+ PKW507 /MATERIALS/US34 /MATERIALS/US36 pBluescript KS+ PKW508 pKW472 - pEG NES-GFP PKW509 pKW472 - pEG NES-GFP PKW51 pJG4-5 PKW510 pBluescript SK PKW511 pKW349 - pRS315 PKW512 pKW511 - pSW503 PKW513 PKW514 YCp50-LEU2 PKW515 pRS316 PKW516 PKW517 PKW518 PKW519 PKW52 pJG4-5 PKW520 pEGFP-C1 PKW521 /MATERIALS/US58 /MATERIALS/US59 pKW417 - pAdhNLS-GFP-NES PKW522 pKW351 PKW523 PKW524 PKW525 pRSET A PKW526 pKW158 - pEG202 PKW527 pKW158 - pEG202 PKW528 pKW164 - pJG4-5 colony PKW529 PKW53 pJG4-5 PKW530 PKW531 PKW532 PKW533 pcDNA3 (Invitrogen) PKW534 pcDNA3 PKW535 pKW164 - pJG4-5 colony PKW536 pKW158 - pEG202 PKW537 /MATERIALS/US60 pKW347 - pRS313 PKW538 pKW164 - pJG4-5 colony PKW539 pKW164 - pJG4-5 colony PKW54 pJG4-5 PKW540 pKW164 - pJG4-5 colony PKW541 pKW164 - pJG4-5 colony PKW542 pKW348 - pRS314 PKW543 pKW350 - pRS316 PKW544 pRSET C PKW545 pRSET B PKW546 pKW394 - pProie PKW547 pRSET B PKW548 pRSET B PKW549 pRSET B PKW55 pJG4-5 PKW550 pRSET B PKW551 pKW349 - pRS315 PKW552 pKW348 - pRS314 PKW553 pKW158 - pEG202 PKW554 pEG202 PKW555 pJG4-5 PKW556 /MATERIALS/US69 /MATERIALS/US70 pKW301 - pRSET Ran PKW557 pZZ70 PKW558 pZZ70 PKW559 PKW56 pJG4-5 PKW560 PKW561 PKW562 PKW563 PKW564 pRS303 PKW565 pKW230 - pRSET XCons PKW566 pRSET C PKW567 PKW568 /MATERIALS/US75 /MATERIALS/US76 pKW558 - pZZ70 PKW569 pRSET B PKW57 pJG4-5 PKW570 pKW394 - pProie PKW571 pQE9 PKW572 /MATERIALS/US76 /MATERIALS/US83 pKW567 - pQE9 PKW573 /MATERIALS/US77 /MATERIALS/US78 pKW350 - pRS316 PKW574 pKW567 - pQE9 PKW575 pRS303 PKW576 pET28a PKW577 pKW467 - pRS CRM1-A1 PKW578 pKW456 - pRS-crm1-1-GFP PKW579 EBO347 PHO4-GFP PKW58 pJG4-5 PKW580 /MATERIALS/US76 /MATERIALS/US83 pKW581 - pQE GSP1 PKW581 /MATERIALS/US83 /MATERIALS/US84 pKW581- pQE GSP1 PKW582 /MATERIALS/US83 /MATERIALS/US84 pKW581 - pQE GSP1 PKW583 pET28a PKW584 PKW585 PKW586 /MATERIALS/US84 /MATERIALS/US87 pKW581 - pQE GSP1 PKW587 pKW580 - pQE GSP1‰ö C PKW588 pRS305 PKW589 PKW59 pJG4-5 PKW590 pKW580 - pQE GSP1‰ö C PKW591 pKW590 PKW592 /MATERIALS/US76 /MATERIALS/US83 pKW581 - pQE GSP1 PKW593 pKW348 - pRS314 PKW594 PKW595 PKW596 PKW597 PKW598 EB0151 PKW599 /MATERIALS/US91 /MATERIALS/US92 pBluescript SK+ PKW6 pSG5 PKW60 pJG4-5 PKW600 pKW350 - pRS316 PKW601 pKW599 - pBS R17-2loops PKW602 pKW601 - pBS2x(R17-2loops) PKW603 pKW602 - pBS4x(R17-2loops) PKW604 /MATERIALS/US95 /MATERIALS/US96 pKW581 - pQE GSP1 PKW605 /MATERIALS/US93 /MATERIALS/US94 pKW604 - pQE R17 PKW606 pKW346 - pRS316-G PKW607 PKW608 PKW609 PKW61 pJG4-5 PKW610 PKW611 PKW612 PKW613 PKW614 PKW615 PKW616 PKW617 PKW618 PKW619 PKW62 pJG4-5 PKW620 PKW621 PKW622 PKW623 PKW624 PKW625 PKW626 PKW627 PKW628 PKW629 /MATERIALS/US100 /MATERIALS/US99 pKW606 - pRSGAL.GFP.R17 PKW63 pJG4-5 PKW630 /MATERIALS/US101 /MATERIALS/US95 pKW605 (pQE.GFP.R17) PKW631 PKW632 PKW633 PKW634 pKW457 PKW635 pKW631 - pQE-30 PKW636 pQE60 PKW637 pQE60 PKW638 /MATERIALS/US102 /MATERIALS/US103 pKW630 (pQE GFP.2XR17) PKW639 /MATERIALS/US102 /MATERIALS/US103 pQE GFP.2XR17 PKW64 pJG4-5 PKW640 /MATERIALS/US102 /MATERIALS/US103 pQE GFP 2XR17 PKW641 /MATERIALS/US104 /MATERIALS/US105 pKW610 (pCM172) PKW642 pKW606(pRSGAL.GFP.R17) PKW643 pKW606(pRSGAL.GFP.R17) PKW644 pKW606(pRSGAL.GFP.R17) PKW645 pKW606(pRSGAL.GFP.R17) PKW646 pKW629(pRSHIS.GFP.R17) PKW647 pKW629(pRSHIS.GFP.R17) PKW648 pKW629(pRSHIS.GFP.R17) PKW649 pKW629(pRSHIS.GFP.R17) PKW65 pJG4-5 PKW650 pKW610 (pCM172) PKW651 pT7T3D-Pac PKW652 pGEX-4T-1 PKW653 pGEX-4T-1 PKW654 /MATERIALS/US114 /MATERIALS/US115 pFA6a-GFP(S65T)-HIS3MX6 PKW655 pKW631 - pQE-30 PKW656 PKW657 PKW658 PKW659 PKW66 pJG4-5 PKW660 pKW470 PKW661 PKW662 PKW663 PKW664 PKW665 PKW666 PKW667 pET-3d PKW668 pKW652 - GST-NES-GFP PKW669 pKW653 - GST-P12-2GFP PKW67 pJG4-5 PKW670 Lafmid BA PKW671 pKW610 - pCM172 PKW672 pKW610 - pCM172 PKW673 /MATERIALS/US112 /MATERIALS/US113 pKW417 PKW674 /MATERIALS/US112 /MATERIALS/US113 pKW431 PKW675 pKW590 - pQE-RanQ69L PKW676 /MATERIALS/US120 /MATERIALS/US121 pKW321 - pRSET bGal PKW677 /MATERIALS/US104 /MATERIALS/US105 pBluescript SK+ PKW678 /MATERIALS/US104 /MATERIALS/US105 pBluescript SK+ PKW679 pKW633 - pQE-32 PKW68 pJG4-5 PKW680 PKW681 PKW682 PKW683 pRS316 PKW684 PKW685 pKW671 - pCM8 PKW686 pKW615 - pCM182 PKW687 /MATERIALS/US118 /MATERIALS/US119 pKW557 - pZZ-Ran PKW688 PKW689 pKW615 - pCM182 PKW69 pJG4-5 PKW690 pKW615 - pCM182 PKW691 /MATERIALS/US118 /MATERIALS/US119 pKW633 - pQE-32 PKW692 pKW686 - pCM182-HIS PKW693 pKW686 - pCM182-HIS PKW694 /MATERIALS/US122 /MATERIALS/US123 pKW590 - pQE-RanQ69L PKW695 pKW694 - pQE-RanQ69L‰ö C PKW696 /MATERIALS/US142 /MATERIALS/US143 pKW633 - pQE-32 PKW697 pKW696 - pQE-RanT24N PKW698 pKW1 - pGEX-2T PKW699 pKW1 - pGEX-2T PKW7 PKW70 pJG4-5 PKW700 pKW683 PKW701 pKW440 PKW702 pKW457 PKW703 pKW349 - pRS315 PKW704 pKW573 PKW705 pKW633 - pQE-32 PKW706 pKW691 - pQE-RCC1 PKW707 PKW708 PKW709 PKW71 pJG4-5 PKW710 PKW711 pKW347 - pRS313 PKW712 pKW577-pRS313 PKW713 /MATERIALS/US142 /MATERIALS/US143 pKW633 - pQE-32 PKW714 /MATERIALS/US142 /MATERIALS/US143 pKW633 - pQE-32 PKW715 PKW716 pBluescript SK+ PKW717 PKW718 PKW719 PKW72 pJG4-5 PKW720 pKW605 - PQE GFP-R17 PKW721 pKW605 - PQE GFP-R17 PKW722 PKW723 /MATERIALS/US165 /MATERIALS/US166 pKW632 - pQE-31 PKW724 /MATERIALS/US165 /MATERIALS/US166 pKW633 - pQE-32 PKW725 pKW577 - pRS XPO1-ZZ PKW726 pKW344 - pRS314-G PKW727 pKW344 - pRS314-G PKW728 pKW709 - pRS306 PKW729 /MATERIALS/US179 /MATERIALS/US180 pKW503 - pBluescriptKS+ PKW73 pJG4-5 PKW730 pKW353 - pRS425 PKW731 pKW353-pRS425 PKW732 PKW733 PKW734 /MATERIALS/US165 /MATERIALS/US166 pKW633 - pQE-32 PKW735 pKW709 - pRS306 PKW736 /MATERIALS/US171 pKW485 PKW737 /MATERIALS/US189 /MATERIALS/US190 pKW163 - pEG202+4 PKW738 pKW282 - pQE60 PKW739 pKW631 - pQE-30 PKW74 pJG4-5 PKW740 pKW282 - pQE60 PKW741 pKW373 - pQE Npl-core PKW742 /MATERIALS/US179 /MATERIALS/US180 pKW503 - pBluescriptKS+ PKW743 PKW744 /MATERIALS/US207 /MATERIALS/US208 PKW745 /MATERIALS/US209 /MATERIALS/US210 PKW746 /MATERIALS/US216 /MATERIALS/US217 pKW485 - pET p97 PKW747 /MATERIALS/US216 /MATERIALS/US218 pKW485 - pET p97 PKW748 /MATERIALS/US195 /MATERIALS/US196 pKW725 PKW749 pKW164 - pJG4-5 PKW75 pJG4-5 PKW750 pKW632 - pQE31 PKW751 pKW616 PKW752 Ref.710 PKW753 pKW752 - pKW710 + Xho PKW754 pKW752 - pKW710 + Xho PKW755 pKW752 - pKW710 + Xho PKW756 pKW752 - pKW710 + Xho PKW757 pET3d PKW758 YIplc204 PKW759 YIplc128 PKW76 pJG4-5 PKW760 pRS303 PKW761 pRS303 PKW762 pKW488 - pET 71-876 PKW763 pKW282 - pQE60 PKW764 pKW282 - pQE60 PKW765 pKW752 - pKW710 + Xho PKW766 pKW752 - pKW710 + Xho PKW767 pKW752 - pKW710 + Xho PKW768 pKW752 - pKW710 + Xho PKW769 pQE70 (Qiagen) PKW77 pJG4-5 PKW770 /MATERIALS/US65 /MATERIALS/US66 pKW655 - pQE-RanBP1 PKW771 PKW772 PKW773 pET30b PKW774 PKW775 PKW776 PKW777 PKW778 PKW779 PKW78 pJG4-5 PKW780 PKW781 PKW782 PKW783 PKW784 PKW785 PKW786 PKW787 PKW788 PKW789 PKW79 pJG4-5 PKW790 PKW791 PKW792 PKW793 PKW794 PKW795 PKW796 PKW797 PKW798 PKW799 PKW8 pGEX-2T PKW80 pJG4-5 PKW800 PKW801 PKW802 /MATERIALS/US291 /MATERIALS/US292 pKW393 - pRS424 PKW803 /MATERIALS/US293 PKW804 /MATERIALS/US293 /MATERIALS/US294 pKW710 PKW805 /MATERIALS/US283 /MATERIALS/US284 pKW346-pGAL PKW806 /MATERIALS/US283 /MATERIALS/US284 pKW346-pGAL PKW807 pKW805 PKW808 pKW806 PKW809 pYX242 PKW81 pJG4-5 PKW810 pET30b PKW811 pET3a PKW812 pKW571- pQE XPO1 PKW813 pKW712-pRSLMBsXPO1 PKW814 PKW815 PKW816 pTYB4 PKW817 PKW818 PKW819 PKW82 pJG4-5 PKW820 PKW821 PKW822 pET30a PKW823 pHAT2-EGFP PKW824 pET28a PKW825 PKW826 PKW827 PKW828 PKW829 PKW83 pJG4-5 PKW830 PKW831 PKW832 PKW833 PKW834 PKW835 pKW825 PKW836 /MATERIALS/US365 /MATERIALS/US448 pKW673 PKW837 PKW838 /MATERIALS/US331 /MATERIALS/US332 pKW633 - pQE32 PKW839 /MATERIALS/US321 /MATERIALS/US322 pKW640 PKW84 pJG4-5 PKW840 PK9 PKW841 pTrcHisB (Invitrogen) PKW842 pQE-9 PKW843 pRS316 PKW844 pRS314 PKW845 EBO346(pRS316-pPHO4-GFP) PKW846 pKW845 PKW847 pKW845 PKW848 pKW847 PKW849 PKW85 pJG4-5 PKW850 pET23b PKW851 pET28a PKW852 PKW853 /MATERIALS/US207 /MATERIALS/US357 PKW854 /MATERIALS/US208 /MATERIALS/US328 pRSET A PKW855 /MATERIALS/US328 /MATERIALS/US357 pRSET A PKW856 PKW857 PKW858 PKW859 PKW86 pJG4-5 PKW860 PKW861 PKW862 /MATERIALS/US496 /MATERIALS/US497 pKW356 - pQE Ran PKW863 PKW864 PKW865 PKW866 PKW867 PKW868 PKW869 PKW87 pJG4-5 PKW870 PKW871 PKW872 PKW873 pKW736 - Imp beta D14N S15 PKW874 PKW875 PKW876 PKW877 pGEX1-1 PKW878 PKW879 PKW88 pJG4-5 PKW880 PKW881 PKW882 PKW883 /MATERIALS/US329 /MATERIALS/US330 pKW810 PKW884 pKW625 PKW885 /MATERIALS/US459 /MATERIALS/US460 pKW625 PKW886 pKW625 PKW887 PKW888 pGEX2T PKW889 PKW89 pJG4-5 PKW890 PKW891 PKW892 PKW893 pGEX-2T PKW894 pGEX-2T PKW895 pGEX-2T PKW896 pGEX-2T PKW897 pGEX-2T PKW898 pGEX-2T PKW899 pGEX-2T PKW9 pUC8 PKW90 pJG4-5 PKW900 pGST-GFP PKW901 pKW708 PKW902 pKW708 - pRS304 PKW903 PKW904 PKW905 PKW906 pKW350 - pRS315 PKW907 PKW908 PKW909 PKW91 pJG4-5 PKW910 PKW911 PKW912 PKW913 pKW862 - pQE32 RanCore PKW914 PKW915 pET30a PKW916 pET30a PKW917 pET30a PKW918 pET30a PKW919 pKW1 - pGEX-2T PKW92 pJG4-5 PKW920 pKW1 - pGEX-2T PKW921 pET30a PKW922 pET30a PKW923 pET30a PKW924 /MATERIALS/US492 /MATERIALS/US493 pKW312 PKW925 pKW631 PKW926 /MATERIALS/US384 /MATERIALS/US385 pKW434 - pBS xpo1-1-GFP PKW927 pKW350 - pRS316 PKW928 /MATERIALS/US386 /MATERIALS/US387 pKW434 PKW929 pKW350 -pRS316 PKW93 pJG4-5 PKW930 /MATERIALS/US465 /MATERIALS/US466 pKW926 PKW931 pKW349 PKW932 /MATERIALS/US463 /MATERIALS/US464 pKW928 PKW933 pKW348 - pRS314 PKW934 PKW935 PKW936 PKW937 PKW938 PKW939 /MATERIALS/US257 /MATERIALS/US473 pKW833 PKW94 pJG4-5 PKW940 /MATERIALS/US257 /MATERIALS/US474 pKW833 PKW941 /MATERIALS/US257 /MATERIALS/US475 pKW833 PKW942 PKW943 PKW944 PKW945 PKW946 PKW947 PKW948 PKW949 PKW95 pJG4-5 PKW950 pFA6aKanMX4 PKW951 pKW913 - pQE-RanQ69Lcore PKW952 pKW710 PKW953 pKW803 PKW954 pKW836 PKW955 pKW625 PKW956 pKW884 PKW957 pET30 PKW958 /MATERIALS/US492 /MATERIALS/US493 pKW312 PKW959 /MATERIALS/US486 /MATERIALS/US487 pKW884-pPHO5 PKW96 pJG4-5 PKW960 /MATERIALS/US492 /MATERIALS/US493 pKW312 PKW961 /MATERIALS/US102 /MATERIALS/US524 pKW958 PKW962 /MATERIALS/US102 /MATERIALS/US524 pKW960 PKW963 pKW639 - pCFP-2xR17 PKW964 pCDNA3 PKW965 /MATERIALS/US529 /MATERIALS/US530 Ref. # 961 PKW966 /MATERIALS/US529 /MATERIALS/US530 Ref. #962 PKW967 pET 30a PKW968 Ref. #962 PKW969 /MATERIALS/US537 PKW97 pJG4-5 PKW970 PKW971 PKW972 /MATERIALS/US540 /MATERIALS/US541 pKW970 PKW973 /MATERIALS/US540 /MATERIALS/US541 PKW974 PKW975 PKW976 PKW977 PKW978 pKW195 PKW979 pET 30a PKW98 pJG4-5 PKW980 pET 30a PKW981 PKW982 PKW983 PKW984 PKW985 PKW986 pKW 13 PKW987 pKW 13 PKW988 EBO640 (PHO4GFP2) PKW989 pRS315 PKW99 pJG4-5 PKW990 pPS2040 (pKW993) PKW991 pPS2040 (pKW993) PKW992 pPS2040 (pKW993) PKW993 pRS246 PKW994 pRS314 PKW995 pPS2038 (pKW992) PKW996 pPS3036 (pKW990) PKW997 pRS313 PKW998 pKW195 PKW999 pRS306 \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plugin.properties b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plugin.properties deleted file mode 100644 index 372cb45d276bdecc947c0ee5529a70f92efc14c1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_plasmid_parents/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path =add_plasmid_parents.py -dropbox-name = add_plasmid_parents -incoming-dir = ${root-dir}/add_plasmid_parents \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/add_strain_parents.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/add_strain_parents.py deleted file mode 100644 index 5f69d16bb9d096274d378ecef4d5526006b1b79d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/add_strain_parents.py +++ /dev/null @@ -1,121 +0,0 @@ -#Dropbox for updating STRAIN samples with strain parents. The input is a txt file downlaoded from openBIS, containing the codes of teh strains already registered, the parents and a property called "derived from". -#we read the property called "derived from" and add these to the list of already existing parents. This has to be done in thi way, and cannot be done when creating the strains, becuase to set strains parenst these have to be already registered in openBIS. -# - -import os, re, glob, shutil,csv - - -print "###################################################" - - - -#read txt file -def parse_incoming(tr): - data_rows = [] - f = open(tr.getIncoming().getAbsolutePath(), 'rU') - dialect = csv.Sniffer().sniff(f.read(1024)) - f.seek(0) - reader = csv.DictReader(f, dialect=dialect) - for row in reader: - data_rows.append(row) - f.close() - return data_rows - -def update_sample_with_parents(tr, sample_dict): - """ Get the specified sample or register it if necessary """ - - space_code = "MATERIALS" - project_code = "YEASTS" - # The dictionary keys come from the CSV file - sample_id = "/MATERIALS/" + sample_dict['Code'] - - yeast_parent_code = sample_dict['derived from'] - yeast_parent_code_split = re.split("and|,|\&|\+|x|/|-|\?|\(|\)|\*| X |\.|", yeast_parent_code) - print sample_id, yeast_parent_code_split - parents_code_list=[] - #e.split("/|-|\?|\(|\)" - # insert=sample_dict['Insert'] - # insert_split=re.split("/|-|\?|\(|\|+)", insert) - # comment=sample_dict['Comment'] - # comment_split = re.split("/|-|\?|\(|\)", comment) - - for name in yeast_parent_code_split: - if not sample_id=="/MATERIALS/KWY5055" and not sample_id=="/MATERIALS/KWY5542" and not sample_id=="/MATERIALS/KWY4260" and not sample_id =="/MATERIALS/KWY5593" and not sample_id == "/MATERIALS/KWY5594": -#KWY5055 has very long text in derived from; KYW5542 has itself set as derived from; KWY4260 has only kwy set as parent, no number -#KWY5593 and KWY5594 have pkw5529 has parent, which is not in the database - sample = tr.getSample(sample_id) - sample_for_update = tr.makeSampleMutable(sample) - if not re.search("Roy Parker", name) and not re.search("ku",name): - if re.search ("2kwy5571", name): - yeast_parent_id = "/MATERIALS/"+name.replace("2kwy5571","KWY5571").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("kwy ", name): - yeast_parent_id = "/MATERIALS/"+name.replace("kwy ","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("Kwy ", name): - yeast_parent_id = "/MATERIALS/"+name.replace("Kwy ","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("KWY ", name): - yeast_parent_id = "/MATERIALS/"+name.replace("KWY ","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("pKW", name): - yeast_parent_id = "/MATERIALS/"+name.replace("pKW","PKW").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("PKW", name): - yeast_parent_id = "/MATERIALS/"+name - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("kwy", name): - yeast_parent_id = "/MATERIALS/"+name.replace("kwy","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.match ("KW\d+", name): - yeast_parent_id = "/MATERIALS/"+name.replace("KW","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("KWYY", name): - yeast_parent_id = "/MATERIALS/"+name.replace("KWYY","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("KWY2823 KWY2757", name): - #name = "/MATERIALSKWY2823,KWY2757" - sample_for_update.setParentSampleIdentifiers(["/MATERIALS/KWY2823"]) - sample_for_update.setParentSampleIdentifiers(["/MATERIALS/KWY2757"]) - elif re.search ("KWy", name): - yeast_parent_id = "/MATERIALS/"+name.replace("KWy","KWY").strip() - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - elif re.search ("KWY", name): - yeast_parent_id = "/MATERIALS/"+name.strip() - if not yeast_parent_id =="/MATERIALS/KWY": - parents_code_list.append(yeast_parent_id) - print "PARENTS: ", parents_code_list - sample_for_update.setParentSampleIdentifiers(parents_code_list) - else: - print "NO PARENTS FOUND!" - - - -def register_samples_in_openbis(tr, data_rows): - for sample_dict in data_rows: - update_sample_with_parents(tr, sample_dict) - - -def process(tr): - data_rows = parse_incoming(tr) - register_samples_in_openbis(tr, data_rows) \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/plugin.properties b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/plugin.properties deleted file mode 100644 index fd7266b797f674b14a1d52a023a9f1da6e8113e1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/add_strain_parents/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path =add_strain_parents.py -dropbox-name = add_strain_parents -incoming-dir = ${root-dir}/add_strain_parents \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitions.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitions.py deleted file mode 120000 index d16e42850d35ea24a66064d8b534deebedc04f56..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitions.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitions.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitionsVoc.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitionsVoc.py deleted file mode 120000 index 1883a7061938c66144390382f1839653b6ca37fa..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/definitionsVoc.py +++ /dev/null @@ -1 +0,0 @@ -../../../as/definitionsVoc.py \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitions.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitions.py deleted file mode 100644 index 67f4986e22a26dc0aed0b7262676b19cb2e559b2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitions.py +++ /dev/null @@ -1,374 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -# -# Helper Methods -# -def getPropertyDefinitionByCode(definition, code): - for property in definition: - if property[0] == code: - return property - return None - -# -# Scripts -# -commentsScriptName = "COMMENTS"; -adenosineScriptName = "ADENOSINE_COUNT" -cytosineScriptName= "CYTOSINE_COUNT" -gcScriptName= "GC" -guanosineScriptName= "GUANOSINE_COUNT" -lengthScriptName= "SEQUENCE_LENGTH" -nucelotideScriptName= "ONUCLEOTIDE_COUNT" -thymidineScriptName= "THYMIDINE_COUNT" -tmScriptName= "TM" - -# -# Storage -# -numberOfStorageGroups = 65 - -def getStorageGroupPropertyCodes(): - propertyCodes = []; - for property in getStorageGroupDefinition(): - propertyCodes.append(property[0]); - return propertyCodes; - -def getStorageGroupDefinition(): - return [ - ["STORAGE_NAME", "Physical Storage", "location", DataType.CONTROLLEDVOCABULARY, "FREEZER", "Storage Name", None, None, False], - ["STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], - ["STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], - ["STORAGE_BOX_NAME", "Physical Storage", "box label", DataType.VARCHAR, None, "Storage Box Name", None, None, False], - ["STORAGE_USER", "Physical Storage", "frozen by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "Storage User Id", None, None, False], - ["STORAGE_BOX_POSITION", "Physical Storage", "position", DataType.VARCHAR, None, "Storage Box Position", None, None, False] -]; - -# -# Experiment Types -# -experimentDefinition = [ - ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], - ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], - ["GRANT", "General", "Grant", DataType.VARCHAR, None, "grant name", None, None, False], - ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], - ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], - ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], - ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] -]; - -# -# Sample Types -# -antibodyDefinition = [ - ["NAME", "General", "antibody ID", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_ID_NR", "General", "antibody_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ANTIGEN", "General", "antigen", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_BLOCK", "General", "block facs", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_IF_BLOCK", "General", "block IFF", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["ANTIBODY_WB_BLOCK", "General", "block western", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], - ["CATALOGUE_NUMBER", "General", "catalog id #", DataType.VARCHAR, None, "", None, None, False], - ["CLASS", "General", "class", DataType.CONTROLLEDVOCABULARY, "CLASS", "", None, None, False], - ["CLONE", "General", "clone", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ANTIBODY_FACS_CONC", "General", "conc facs", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IF_CONC", "General", "conc IFF", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], - ["ANTIBODY_IP_CONC", "General", "conc ip", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_IP", "", None, None, False], - ["ANTIBODY_WB_CONC", "General", "conc western", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_WESTERN", "", None, None, False], - ["ANTIBODY_CONCENTRATION", "General", "concentration", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_CROSSREACTIVITY", "General", "crossreactivity", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_FACS_FIX", "General", "fix facs", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_IF_FIX", "General", "fix IFF", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["ANTIBODY_WB_FIX", "General", "fix western", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LABEL", "General", "label", DataType.CONTROLLEDVOCABULARY, "LABEL", "", None, None, False], - ["LOTNUMBER", "General", "lotnumber", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MONO_POLYCLONAL", "General", "mono/polyclonal", DataType.CONTROLLEDVOCABULARY, "MONO-POLYCLONAL", "", None, None, False], - ["ANTIBODY_FACS_NOTES", "General", "notes FACS", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IF_NOTES", "General", "notes IFF", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_IP_NOTES", "General", "notes IP", DataType.VARCHAR, None, "", None, None, False], - ["ANTIBODY_WB_NOTES", "General", "notes western", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["ANTIGEN_SIZE", "General", "size", DataType.VARCHAR, None, "", None, None, False], - ["SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "SOURCE", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["BOX", "Storage", "box", DataType.VARCHAR, None, "", None, None, False], - ["RACK", "Storage", "rack", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -cellDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR", "General", "cell_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_NR_COPY", "General", "cell_id_nr Copy", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], - ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], - ["CLONE", "General", "clone #", DataType.INTEGER, None, "", None, None, False], - ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC4", "General", "conc.4", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT4", "General", "concentration unit 4", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINE_NAME", "General", "line name", DataType.VARCHAR, None, "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MYCOPLASM_TESTED", "General", "mycoplasm_tested", DataType.BOOLEAN, None, "", None, None, False], - ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERS_CELL_NUMBER", "General", "PersCellNumber", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SELECTION_PLASMID4", "General", "sel.4", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], - ["VIRUS_ID1", "General", "virus ID 1", DataType.VARCHAR, None, "", None, None, False], - ["VIRUS_ID2", "General", "virus ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] -]; - -strainDefinition = [ - ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], - ["BACKGROUND", "General", "background", DataType.CONTROLLEDVOCABULARY, "STRAIN_BACKGROUND", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["CIR", "General", "cir", DataType.CONTROLLEDVOCABULARY, "CIR", "", None, None, False], - ["CONC_INDUCER1", "General", "conc. inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER2", "General", "conc. inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["CONC_INDUCER3", "General", "conc. inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], - ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], - ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DERIVATION", "General", "derivation", DataType.CONTROLLEDVOCABULARY, "DERIVATION", "", None, None, False], - ["EXPRESSED_PROTEIN1", "General", "expressed protein 1", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN2", "General", "expressed protein 2", DataType.VARCHAR, None, "", None, None, False], - ["EXPRESSED_PROTEIN3", "General", "expressed protein 3", DataType.VARCHAR, None, "", None, None, False], - ["FREE_PLASMID", "General", "freeplasmid", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GAL", "General", "gal", DataType.CONTROLLEDVOCABULARY, "GAL", "", None, None, False], - ["GENE_EXPRESSION1", "General", "gene expression 1", DataType.VARCHAR, None, "", None, None, False], - ["GENE_EXPRESSION2", "General", "gene expression 2", DataType.VARCHAR, None, "", None, None, False], - ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], - ["INDUCER1", "General", "inducer 1", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER2", "General", "inducer 2", DataType.VARCHAR, None, "", None, None, False], - ["INDUCER3", "General", "inducer 3", DataType.VARCHAR, None, "", None, None, False], - ["COMMENTS", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MARKERS", "General", "markers", DataType.VARCHAR, None, "", None, None, False], - ["MAT", "General", "mat", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], - ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], - ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NUMBER", "General", "number", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_OBTAINED_FROM", "General", "obtained from", DataType.VARCHAR, None, "", None, None, False], - ["ORF", "General", "orf", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], - ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], - ["PERSYEASTNUMBER", "General", "persyeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PETERYEASTNUMBER", "General", "peteryeastnumber", DataType.INTEGER, None, "", None, None, False], - ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER1", "General", "promoter 1", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER2", "General", "promoter 2", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER3", "General", "promoter 3", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "General", "reference", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION1", "General", "sel.1", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION2", "General", "sel.2", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION3", "General", "sel.3", DataType.VARCHAR, None, "", None, None, False], - ["SELECTION", "General", "selection", DataType.CONTROLLEDVOCABULARY, "SELECTION_YEAST", "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "STRAIN_SOURCE", "", None, None, False], - ["SPECIES", "General", "species", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_ID_NR", "General", "strain_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["NAME", "General", "strain ID", DataType.VARCHAR, None, "", None, None, False], - ["STRAIN_NAME", "General", "strain name", DataType.VARCHAR, None, "", None, None, False] -]; - -oligoDefinition = [ - ["AMOUNT", "General", "amount", DataType.REAL, None, "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "OLIGO_COMPANY", "", None, None, False], - ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["GRADE", "General", "grade", DataType.CONTROLLEDVOCABULARY, "OLIGO_GRADE", "", None, None, False], - ["COMMENTS", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["OD", "General", "od", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "oligo ID", DataType.INTEGER, None, "", None, None, False], - ["OLIGO_ID_NR", "General", "oligo_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["ORDER_DATE", "General", "order date", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "OLIGO_ORGANISM", "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_PARTNER", "General", "primer partner", DataType.VARCHAR, None, "", None, None, False], - ["PRIMER_POSITION", "General", "primer position", DataType.CONTROLLEDVOCABULARY, "PRIMER_POSITION", "", None, None, False], - ["PUBLISHED_IN", "General", "PublishedIn", DataType.VARCHAR, None, "", None, None, False], - ["RESTRICTION_SITE", "General", "restriction site", DataType.CONTROLLEDVOCABULARY, "RESTRICTION", "", None, None, False], - ["SEQUENCE", "General", "sequence", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.VARCHAR, None, "", None, None, False], - ["USAGE", "General", "usage", DataType.CONTROLLEDVOCABULARY, "OLIGO_USAGE", "", None, None, False], - ["ADENOSINE", "Calculated fields", "adenosine", DataType.INTEGER, None, "", adenosineScriptName, None, False], - ["CYTOSINE", "Calculated fields", "cytosine", DataType.INTEGER, None, "", cytosineScriptName, None, False], - ["GUANOSINE", "Calculated fields", "guanosine", DataType.INTEGER, None, "", guanosineScriptName, None, False], - ["THYMIDINE", "Calculated fields", "thymidine", DataType.INTEGER, None, "", thymidineScriptName, None, False], - ["LENGTH", "Calculated fields", "length", DataType.INTEGER, None, "", lengthScriptName, None, False], - ["GC", "Calculated fields", "gc", DataType.REAL, None, "", gcScriptName, None, False], - ["TM", "Calculated fields", "tm", DataType.REAL, None, "", tmScriptName, None, False], - ["O_NUCLEOTIDE", "Calculated fields", "O nucleotide", DataType.INTEGER, None, "", nucelotideScriptName, None, False] -]; - -plasmidDefinition = [ - ["BACKBONE", "General", "backbone", DataType.CONTROLLEDVOCABULARY, "BACKBONE", "", None, None, False], - ["BACKUP_STORAGE", "General", "backup storage", DataType.VARCHAR, None, "", None, None, False], - ["BACTERIAL_HOST", "General", "bacterial host", DataType.CONTROLLEDVOCABULARY, "BACTERIAL_HOST", "", None, None, False], - ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], - ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], - ["BIOSAFETY_LEVEL", "General", "biosafety level", DataType.CONTROLLEDVOCABULARY, "BIOSAFETY_LEVEL", "", None, None, False], - ["BOXNR", "General", "boxNr", DataType.VARCHAR, None, "", None, None, False], - ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], - ["CONSTRUCTION_METHOD", "General", "construction method", DataType.VARCHAR, None, "", None, None, False], - ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], - ["CTERMTAG", "General", "Ctermtag", DataType.VARCHAR, None, "", None, None, False], - ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], - ["DATE_OF_CONSTRUCTION", "General", "date of construction", DataType.TIMESTAMP, None, "", None, None, False], - ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], - ["ECOLI_STRAIN", "General", "E.coli strain", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT", "General", "excise insert", DataType.VARCHAR, None, "", None, None, False], - ["EXCISE_INSERT2", "General", "excise insert 2", DataType.VARCHAR, None, "", None, None, False], - ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], - ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], - ["FUNCTIONAL_ELEMENTS_INSERT", "General", "functional elements insert", DataType.VARCHAR, None, "", None, None, False], - ["HYPERCARD_FILE", "General", "hypercard file", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["INSERT", "General", "insert", DataType.VARCHAR, None, "", None, None, False], - ["INSERTION_SITE", "General", "insertion site", DataType.VARCHAR, None, "", None, None, False], - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["LINEARIZE", "General", "linearize", DataType.VARCHAR, None, "", None, None, False], - ["MARKER", "General", "Marker", DataType.VARCHAR, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False], - ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["NAME_OF_PARENTAL_CLONE", "General", "name of parental clone", DataType.VARCHAR, None, "", None, None, False], - ["NAME_OF_VECTOR", "General", "name of vector", DataType.VARCHAR, None, "", None, None, False], - ["NTERMTAG", "General", "Ntermtag", DataType.VARCHAR, None, "", None, None, False], - ["NUCLEOTIDE_SEQUENCE", "General", "nucleotide sequence", DataType.VARCHAR, None, "", None, None, False], - ["OLIGOS_USED", "General", "oligos used", DataType.VARCHAR, None, "", None, None, False], - ["ORGANISM", "General", "organism", DataType.VARCHAR, None, "", None, None, False], - ["ORIGIN_OF_REPLICATION", "General", "origin of replication", DataType.VARCHAR, None, "", None, None, False], - ["OTHER_MARKER", "General", "other marker", DataType.VARCHAR, None, "", None, None, False], - ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], - ["PERSPLASMIDNUM", "General", "persPlasmidnum", DataType.REAL, None, "", None, None, False], - ["PETERPLASMIDNUM", "General", "PeterPlasmidNum", DataType.INTEGER, None, "", None, None, False], - ["NAME", "General", "plasmid ID", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_ID_NR", "General", "plasmid_id_nr", DataType.VARCHAR, None, "", None, None, False], - ["PLASMIDNAME", "General", "plasmidname", DataType.VARCHAR, None, "", None, None, False], - ["PRIMERS", "General", "primers", DataType.VARCHAR, None, "", None, None, False], - ["PROMOTER", "General", "promoter", DataType.CONTROLLEDVOCABULARY, "PROMOTER", "", None, None, False], - ["SELECTION_IN_BACTERIA", "General", "selection in bacteria", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_BACTERIA", "", None, None, False], - ["SELECTION_IN_EUKARYOTES", "General", "selection in eukaryotes", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_EUKARYOTES", "", None, None, False], - ["SEQUENCE_FILE_NAME", "General", "sequence file name", DataType.VARCHAR, None, "", None, None, False], - ["SEQUENCING_DATE", "General", "sequencing date", DataType.TIMESTAMP, None, "", None, None, False], - ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], - ["SHELF", "General", "shelf", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_INSERT", "General", "size insert", DataType.REAL, None, "", None, None, False], - ["SIZE_OF_INSERT", "General", "size of insert", DataType.VARCHAR, None, "", None, None, False], - ["SIZE_VECTOR", "General", "size vector", DataType.REAL, None, "", None, None, False], - ["PLASMID_SOURCE", "General", "source", DataType.VARCHAR, None, "", None, None, False], - ["PLASMID_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "PLASMID_ORGANISM", "", None, None, False], - #["TUBES", "General", "TUBES", DataType.VARCHAR, None, "", None, None, False], - ["URL", "Reference", "url", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED_IN", "Reference", "published in", DataType.VARCHAR, None, "", None, None, False] -]; - -chemicalDefinition = [ - ["ARTICLE", "General", "Article", DataType.VARCHAR, None, "", None, None, False], - ["COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], - ["ARTICLE_NUM", "General", "Article Number", DataType.VARCHAR, None, "", None, None, False], - ["RECORD_NUMBER", "General", "RecordNumber", DataType.VARCHAR, None, "", None, None, False], - ["LOCATION", "Location", "Location", DataType.VARCHAR, None, "", None, None, False] -]; - -siRNADefinition = [ - ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], - ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], - ["EXON_OR_THREE_PRIME", "General", "exon or three prime", DataType.CONTROLLEDVOCABULARY, "EXON_OR_THREE_PRIME", "", None, None, False], - ["EXON", "General", "exon #", DataType.INTEGER, None, "", None, None, False], - ["3_PRIME_POSITION", "General", "3' position", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "SIRNA_SPECIES", "", None, None, False], - ["SEQUENCE", "General", "SEQUENCE", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "SIRNA_COMPANY", "", None, None, False], - ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.REAL, None, "", None, None, False], - ["WORKING_CONCENTRATION", "General", "Working concentration", DataType.REAL, None, "", None, None, False], - ["EFFICIENCY", "General", "Efficiency", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_QPCR", "General", "Efficiency_qPCR", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_WESTERN", "General", "Efficiency_Western", DataType.VARCHAR, None, "", None, None, False], - ["EFFICIENCY_OTHER", "General", "Efficiency_other", DataType.VARCHAR, None, "", None, None, False], - ["OFF_TARGET_EFFECTS", "General", "Off target effects", DataType.VARCHAR, None, "", None, None, False], - ["INFO", "General", "Info", DataType.VARCHAR, None, "", None, None, False], - ["SPECIFIC_SPLICE_VARIANT", "General", "Specific splice variant", DataType.VARCHAR, None, "", None, None, False], - ["TRANSFECTION_AGENT", "General", "Transfection agent", DataType.CONTROLLEDVOCABULARY, "TRANSFECTION_AGENT", "", None, None, False], - ["LIBRARY", "General", "Library", DataType.VARCHAR, None, "", None, None, False], - ["CHARACTERIZED_BY_COMPANY", "General", "Characterized by company", DataType.VARCHAR, None, "", None, None, False], - ["NUMBERINPOOL", "General", "NumberINpool", DataType.INTEGER, None, "", None, None, False], - ["TEST", "General", "Test", DataType.VARCHAR, None, "", None, None, False], - ["CHEMICAL_MODIFICATION", "General", "Chemical modification", DataType.VARCHAR, None, "", None, None, False], - ["OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_OLIGONUMBER", "General", "siRNA_OligoNumber", DataType.VARCHAR, None, "", None, None, False], - ["SIRNA_FREEZER_LOCATION", "General", "Freezer Location", DataType.CONTROLLEDVOCABULARY, "SIRNA_FREEZER_LOCATION", "", None, None, False], - ["DRAWER", "General", "Drawer", DataType.VARCHAR, None, "", None, None, False], - ["PUBLISHED", "Reference", "Published", DataType.VARCHAR, None, "", None, None, False] -]; - -# -# Data Set Types -# -documentDefinition = [ - ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], - ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], - ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], - ["ID_NR", "General", "id_nr", DataType.VARCHAR, None, "", None, None, False], - ["FILE", "General", "file", DataType.VARCHAR, None, "", None, None, False], - ["SERIAL", "General", "serial", DataType.INTEGER, None, "", None, None, False] - -]; diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitionsVoc.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitionsVoc.py deleted file mode 100644 index 83fc17f19b34ba3d65064d86fb5089432afbf91c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/defs/definitionsVoc.py +++ /dev/null @@ -1,846 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Helper Methods -# -def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): - vocabulary = vocabularyDefinitions[vocabularyCode] - for term in vocabulary: - if term[1] == termLabel: - #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") - return term[0] - return None - -# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } -createdVocabularyTerms = { } - -def printCreatedTerms(): - print "--- Created Vocabulary Terms Report" - for vocabularyCode in createdVocabularyTerms: - print "Vocabulary [" + vocabularyCode + "]" - for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: - print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" - print "---" - -def getCreatedTerm(vocabularyCode, termCode): - if vocabularyCode in createdVocabularyTerms: - if termCode in createdVocabularyTerms[vocabularyCode]: - return createdVocabularyTerms[vocabularyCode][termCode] - return None - -def addCreatedTerm(vocabularyCode, termCode, object): - if vocabularyCode not in createdVocabularyTerms: - createdVocabularyTerms[vocabularyCode] = {} - createdVocabularyTerms[vocabularyCode][termCode] = object - -def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): - createdTerm = getCreatedTerm(vocabularyCode, termCode) - if createdTerm is None: - vocabulary = tr.getVocabularyForUpdate(vocabularyCode) - - for term in vocabulary.getTerms(): - if term.getCode() == termCode: - createdTerm = term - - if createdTerm is None: - createdTerm = tr.createNewVocabularyTerm() - createdTerm.setCode(termCode) - createdTerm.setLabel(termLabel) - createdTerm.setOrdinal(vocabulary.getTerms().size()) - vocabulary.addTerm(createdTerm) - addCreatedTerm(vocabularyCode, termCode, createdTerm) - return createdTerm - -# -# Vocabularies -# - -vocabularyDefinitions = { - "ALL_LAB_MEMBERS" : [ - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["BRIAN_LUKE", "Brian Luke"], - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["CELINE_LAFOURCADE", "Celine Lafourcade"], - ["CHRISTINE_RUPP", "Christine Rupp"], - ["CLAUDINE_KRAFT", "Claudine Kraft"], - ["EDYTA_SIERGIEJUK", "Edyta Siergiejuk"], - ["FABIAN_HERZOG", "Fabian Herzog"], - ["FABIAN_RUDOLF", "Fabian Rudolf"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["GWEN_RABUT", "Gw\xe9nael Rabut"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["IRAM_ZAIDI", "Iram Zaidi"], - ["IZABELA_SUMARA", "Izabela Sumara"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["MALIKAJAQUENOUD", "MalikaJaquenoud"], - ["MARC_SOHRMANN", "Marc Sohrmann"], - ["MARIE-LYN_HECHT", "Marie-Lyn Hecht"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["MICHAEL_OLMA", "Michael Olma"], - ["MICHAEL_SCHNEIDER", "Michael Schneider"], - ["MICHELE_KNAUS", "Michele Knaus"], - ["MONIKA_GERSBACH", "Monika Gersbach"], - ["NATHALIE_MEYER-SCHALLER", "Nathalie Meyer-Schaller"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["NICOLAS_DARD", "Nicolas Dard"], - ["NICOLAS_PAGE", "Nicolas Page"], - ["PATRICK_PEDRIOLI", "Patrick Pedrioli"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["PIERRE_MAILLARD", "Pierre Maillard"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["SANDER_SPRINGER", "Sander Springer"], - ["SARAH_GLASER", "Sarah Glaser"], - ["SARAH_MAERKI", "Sarah M\xe4rki"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["SERGE_PELET", "Serge Pelet"], - ["STEFAN_MUELLER", "Stefan M�ller"], - ["TANIA_ROBERTS", "Tania Roberts"], - ["THIMO_KURZ", "Thimo Kurz"], - ["TOBIAS_BRAUN", "Tobias Braun"], - ["VANESSA_REZGUI", "Vanessa Rezgui"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["YVONNE_GLOOR", "Yvonne Gloor"], - ["JOCHEN_BECK", "Jochen Beck"], - ["MONIKA_KIJANSKA", "Monika Kijanska"], - ["ANGIE_RAGHEB", "Angie Ragheb"], - ["ANNE_PACQUELET", "Anne Pacquelet"], - ["BJORN_HEGEMANN", "Bj\xf6rn Hegemann"], - ["JANNY_TILMA", "Janny Tilma"], - ["THIBAULT_COURTHEOUX", "Thibault Courtheoux"], - ["SAMUEL_GILBERTO", "Samuel Gilberto"], - ["REMY_BUSER", "Remy Buser"], - ["RADOSLAV_ENCHEV", "Radoslav Enchev"], - ["MICHAELA_HUBNER", "Michaela Hubner"], - ["MIA_LI", "Mia Li"], - ["JULIEN_MOUYSSET", "Julien Mouysset"] - ], - "LAB_MEMBERS_INITIALS" : [ - ["AD", "AD"], - ["ACB", "ACB"], - ["BL", "BL"], - ["CZ", "CZ"], - ["CL", "CL"], - ["CR", "CR"], - ["CK", "CK"], - ["ES", "ES"], - ["FH", "FH"], - ["FR", "FR"], - ["FD", "FD"], - ["GJ", "GJ"], - ["GR", "GR"], - ["ISS", "ISS"], - ["IZ", "IZ"], - ["IS", "IS"], - ["LP", "LP"], - ["MJ", "MJ"], - ["MSO", "MSo"], - ["MH", "MH"], - ["MG", "MG"], - ["MP", "MP"], - ["MO", "MO"], - ["MSC", "MSc"], - ["MK", "MK"], - ["MG", "MG"], - ["NS", "NS"], - ["NPE", "NPe"], - ["ND", "ND"], - ["NPA", "NPa"], - ["PP", "PP"], - ["PW", "PW"], - ["PM", "PM"], - ["RD", "RD"], - ["SS", "SS"], - ["SG", "SG"], - ["SMA", "SMa"], - ["SL", "SL"], - ["SP", "SP"], - ["SM", "SM"], - ["TR", "TR"], - ["TK", "TK"], - ["TB", "TB"], - ["VR", "VR"], - ["WP", "WP"], - ["YS", "YS"], - ["YG", "YG"], - ["JB", "JB"], - ["MKI", "MKi"] - ], - "BLOCK" : [ - ["1BSA_01TRITON-X100", "1% BSA; 0.1% Triton-X100"], - ], - "CLASS" : [ - ["IGM", "IgM"], - ["IGG1", "IgG1"], - ["IGG2", "IgG2"] - ], - "COMPANY" : [ - ["ABCAM", "abcam"], - ["CELL_SIGNALING", "cell signaling"], - ["STRATAGEN", "stratagene"], - ["CLONTECH", "clontech"], - ["UBI", "ubi"], - ["SOUTHERN_BIOTECH", "southern biotech"], - ["PIERCE", "pierce"], - ["PHARMIGEN", "pharmingen"], - ["MOLECULAR_PROBES", "molecular probes"], - ["PHARMACIA", "pharmacia"], - ["BIORAD", "biorad"], - ["EUROGENETIC", "eurogentec"], - ["HOMEMADE", "homemade"], - ["BD_BIOSCIENCE", "BD bioscience"], - ["OBTAINED_FROM", "obtained from "], - ["ZYMED", "Zymed"], - ["UNKNOWN", "Unknown"], - ["SANTA_CRUZ", "Santa Cruz"], - ["BIOLEGEND", "Biolegend"], - ["BETHYL", "Bethyl"], - ["UPSTATE", "Upstate"], - ["ROCKLAND", "Rockland"], - ["NOVUS_BIOLOGICALS", "Novus Biologicals"], - ["CHEMICON_INTERNATIONAL", "Chemicon International"], - ["SIGMA", "Sigma"], - ["ALPHA_DIAGNOSTIC_INTERNATIONAL", "Alpha Diagnostic International"], - ["MILLIPORE", "Millipore"], - ["ACTIVE_MOTIF", "Active motif"], - ["NEB", "NEB"], - ["NEOMARKERS", "Neomarkers"], - ["LUBIOSCIENCE", "LubioScience"], - ["EBIOSCIENCE", "eBioscience"], - ["INVITROGEN", "Invitrogen"], - ["STRESSGEN", "Stressgen"], - ["COVANCE", "Covance"], - ["ENZO_LIFE_SCIENCES", "Enzo Life Sciences"], - ["CALBIOCHEM", "Calbiochem"], - ["ROCHE", "Roche"], - ["CYTOSKELETON", "Cytoskeleton"], - ["OPEN_BIOSYSTEMS", "Open Biosystems"], - ["BD_TRANSDUCTION", "BD Transduction"], - ["ATLAS_ANTIBODIES_AB", "Atlas Antibodies AB"], - ["GENENTECH", "Genentech"], - ["TRANSDUCTION_LABS", "Transduction Labs"], - ["ANTIBODIES_INCORPORATED", "Antibodies Incorporated"], - ["BABCO", "BAbCO"], - ["ERICH_NIGG_LAB_BASEL", "Erich Nigg lab (Basel)"], - ["FRANCIS_BARR", "Francis Barr"], - ["AVIVA_SYSTEMS_BIOLOGY", "Aviva Systems Biology"], - ["LUCERNACHEM", "LucernaChem"], - ["LI-COR", "LI-COR"], - ["ABGENT", "Abgent"], - ["CHROMOTEK", "Chromotek"], - ["ABNOVA", "Abnova"], - ["UNKNOWN", "Unknown"], - ["ABSEA", "Absea"], - ["GE_HEALTHCARE", "GE Healthcare"], - ["GRAMSCH_LABORATORIES", "Gramsch Laboratories"], - ["ADIPOGEN", "Adipogen"], - ["COSMO_BIO_CO", "Cosmo bio co."], - ["BECKTON_DICKINSON", "Beckton Dickinson"], - ["BIOTIUM", "Biotium"] - ], - "CONCENTRATION_FACS" : [ - ["1_TO_10", "1 : 10"], - ["1_TO_20", "1 : 20"], - ["1_TO_30", "1 : 30"], - ["1_TO_40", "1 : 40"], - ["1_TO_50", "1 : 50"], - ["1_TO_100", "1 : 100"], - ["1_TO_200", "1 : 200"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_IP" : [ - ["1UL", "1 �l"], - ["5UL", "5 �l"], - ["10UL", "10 �l"], - ["15UL", "15 �l"], - ["20UL", "20 �l"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CONCENTRATION_WESTERN" : [ - ["1_TO_100", "1 : 100"], - ["1_TO_500", "1 : 500"], - ["1_TO_1000", "1 : 1000"], - ["1_TO_2000", "1 : 2000"], - ["1_TO_3000", "1 : 3000"], - ["1_TO_5000", "1 : 5000"], - ["1_TO_10000", "1 : 10000"], - ["1_TO_20000", "1 : 20000"], - ["1_TO_25000", "1 : 25000"], - ["NOT_TESTED", "not tested"], - ["NOT_WORKING", "not working"] - ], - "CURRENT_LAB_MEMBERS" : [ - ["CAROLINE_ZBINDEN", "Caroline Zbinden"], - ["FRANK_VAN_DROGEN", "Frank Van Drogen"], - ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["REINHARD_DECHANT", "Reinhard Dechant"], - ["WOJCIECH_PIWKO", "Wojciech Piwko"], - ["JOCHEN_BECK", "Jochen Beck"] - ], - "FIX" : [ - ["1H-RT", "1h, RT"], - ["PTEMF", "PTEMF"], - ["PFA", "PFA"], - ["MEOH", "MeOH"] - ], - "LABEL" : [ - ["HRP", "hrp"], - ["AP", "ap"], - ["FITC", "fitc"], - ["CY3", "Cy3"], - ["ALEXA647", "Alexa 647"] - ], - "ANTIBODY_LOCATION" : [ - ["SMALL_PETER_LAB", "Small Peter Lab"], - ["BIG_PETER_LAB", "Big Peter Lab"], - ["NEW_PETER_LAB", "New Peter Lab"], - ["MINUS20_C-FLOOR", "-20C C-Floor"] - ], - "MONO-POLYCLONAL" : [ - ["MONOCLONAL", "Monoclonal"], - ["POLYCLONAL", "Polyclonal"], - ["UNKNOWN", "Unknown"] - ], - "SOURCE" : [ - ["MOUSE", "Mouse"], - ["RABBIT", "Rabbit"], - ["HAMSTER", "Hamster"], - ["GOAT", "Goat"], - ["RAT", "Rat"], - ["CHICKEN", "Chicken"], - ["SHEEP", "Sheep"], - ["HUMAN", "Human"], - ["GUINEA_PIG", "Guinea pig"], - ["DONEKY", "Donkey"], - ["UNKNOWN", "Unknown"] - ], - "CELL_LOCATION" : [ - ["FRIDGE", "fridge"], - ["FREEZER", "freezer"], - ["REFCO", "refco"], - ["TANK", "tank"] - ], - "SELECTION" : [ - ["NEOMYCIN_G418", "Neomycin/G418"], - ["HYGROMYCIN", "Hygromycin"], - ["MPA", "MPA"], - ["G418", "G418"], - ["PUROMYCIN", "puromycin"], - ["BLASTICIDIN", "Blasticidin"], - ["ZEOCIN", "Zeocin"] - ], - "CO2" : [ - ["5", "5"], - ["7.5", "7.5"] - ], - "GROWTH_TEMPERATURE" : [ - ["37", "37"], - ["28", "28"], - ["34", "34"] - ], - "MEDIUM" : [ - ["RPMI1640", "RPMI 1640"], - ["ISCOVES", "Iscoves"], - ["DMEM", "DMEM"], - ["LB", "LB"], - ["DMEM_NUTRIENT", "DMEM nutrient mixture F-12 HAM [D8437]"] - ], - "CELL_OBTAINED_FROM" : [ - ["FREIBURG", "Freiburg"], - ["ATCC", "ATCC"], - ["DANIEL_GERLICH", "Daniel Gerlich"], - ["ERICH_NIGG", "Erich Nigg"], - ["KREK", "Krek"], - ["TONY_HEYMAN", "Tony Heyman"], - ["THOMAS-WILD_ULRIKE-KUTAY", "Thomas Wild/Ulrike Kutay"], - ["JAN_MICHAEL_PETERS", "Jan-Michael Peters"], - ["M_BRANDEIS", "M Brandeis"], - ["ARI_HELENIUS", "Ari Helenius"], - ["ROMEO_RICCI", "Romeo Ricci"] - ], - "CELL_SPECIES" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["CHINESE_HAMSTER", "chines hamster"], - ["HYBRIDOMA", "hybridoma (human & mouse)"] - ], - "CONC_UNITS" : [ - ["MICROG_MICROL", "�g/�l"], - ["MG_ML", "mgl/ml"], - ["UG_ML", "ug/ml"] - ], - "STRAIN_SOURCE" : [ - ["F_CHANG", "F. Chang"], - ["J_CHANT", "J. Chant"], - ["R_DESHAIES", "R. Deshaies"], - ["E_ELION", "E. Elion"], - ["P_HIETER", "P. Hieter"], - ["I_HERSKOWITZ", "I. Herskowitz"], - ["A_NEIMAN", "A. Neiman"], - ["P_SORGER", "P. Sorger"], - ["T_STEARNS", "T. Stearns"], - ["MARC_BONDEL", "Marc Bondel"], - ["G_SUMARA", "G. Sumara"], - ["MICHAEL_ALTMANN", "Michael Altmann"], - ["HETEROZYGOUS_DIPLOID_COLLECTION", "Heterozygous diploid collection"], - ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], - ["ANNE_PAQUELET", "Anne Paquelet"], - ["YAGMUR-TURGAY_KUTAY-GROUP", "Yagmur Turgay - Kutay group"], - ["BARBAR_CATARIN", "Barbar Catarin"], - ["FRANK_VAN-DROGEN", "Frank van Drogen"], - ["HEMMO_MEYER", "Hemmo Meyer"], - ["JEAN-MARC_GALLAND", "Jean-Marc Galland"], - ["JEFF_PARVIN", "Jeff Parvin"], - ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], - ["MIKIKO_TAKAHASHI", "Mikiko Takahashi"], - ["SANDRA_HENCHOZ", "Sandra Henchoz"], - ["MALIKA_JAQUENOUD", "Malika Jaquenoud"], - ["GERDA_JORRITSMA", "Gerda Jorritsma"], - ["CELINE_LAFOURCADE", "Céline Lafourcade"], - ["CELINE_LONGARETTI", "Céline Longaretti"], - ["BRIAN_LUKE", "Brian Luke"], - ["GUY_NIEDERHAUSER", "Guy Niederhäuser"], - ["NICOLAS_PAGE", "Nicolas Pag�"], - ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], - ["MATTHIAS_PETER", "Matthias Peter"], - ["AUDREY_PETIT", "Audrey Petit"], - ["LIONEL_PINTARD", "Lionel Pintard"], - ["YUKIKO_SHIMADA", "Yukiko Shimada"], - ["PHILIPPE_WIGET", "Philippe Wiget"], - ["VOLKER_STUCKE", "Volker Stucke"], - ["KATRIN_PETER", "Katrin Peter"], - ["MARC_BLONDEL", "marc blondel"], - ["M_FUNK", "M. Funk"], - ["ATTILA_BECSKEI", "Attila Becskei"], - ["GWENAEL_RABUT", "Gwenael Rabut"], - ["PHILIP_JERMANN", "Philip Jermann"], - ["P_PRYCIAK", "P.Pryciak"], - ["LINDA_HICKE", "Linda Hicke"], - ["RZPD", "RZPD"], - ["OPENBIO", "OpenBio"], - ["F_POSAS", "F. Posas"], - ["HAPLOID_COLLECTION", "Haploid collection"], - ["MIRIAM_BORTFELD", "Miriam Bortfeld"], - ["EUROSCARF", "Euroscarf"], - ["TS_COLLECTION", "ts collection"], - ["CONZELMANN_LAB", "Conzelmann lab"], - ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], - ["ANNA_DEPLAZES", "Anna Deplazes"], - ["BIBOU", "Bibou"], - ["MARC_SOHRMANN", "Marc sohrmann"] - ], - "SELECTION_YEAST" : [ - ["NONE", "None"], - ["URA", "Ura"], - ["LEU", "Leu"], - ["TRP", "Trp"], - ["HIS", "His"], - ["VIABILITY", "Viability"], - ["NAT", "nat"], - ["KAN", "kan"], - ["KAN_NAT", "kan + nat"], - ["HIS_KAN", "HIS + kan"], - ["HIS_KAN_NAT", "HIS + kan + nat"], - ["HIS", "HIS"], - ["LEU_NAT", "leu + nat"], - ["ADE2", "ade2"] - ], - "DERIVATION" : [ - ["GAMMA_INTEG", "gamma integ"], - ["DELTA_INTEG", "� integ"], - ["5FAO_LOOPOUT", "5-FAO loopout"], - ["PLASMID_SHUFFLE", "plasmid shuffle"], - ["TETRAD", "tetrad"], - ["LOOP-IN_LOOP-OUT", "loop-in/loop-out"], - ["GALPHO", "GalpHO mating type switch"], - ["DELETION", "Deletion"], - ["INTEGRATION", "Integration"] - ], - "STRAIN_BACKGROUND" : [ - ["W303", "W303"], - ["K699", "K699"], - ["K700", "K700"], - ["S288C", "S288C"], - ["1278", "*1278*"], - ["EG123", "EG123"], - ["DF5", "DF5"], - ["SIGMA", "Sigma"], - ["UNKNOWN", "Don't know"], - ["BY7092", "BY7092"], - ["BY5565", "BY5565"], - ["BY4741", "BY4741"] - ], - "CIR" : [ - ["CIR_PLUS", "cir+"], - ["CIR_DEG", "cir�"], - ], - "GAL" : [ - ["PLUS", "Plus"], - ["PLUS_PLUS", "Plus/Plus"], - ["GAL1", "gal1"], - ["GAL1_GAL1", "gal1/gal1"], - ["GAL2", "gal2"], - ["GAL2_GAL2", "gal2/gal2"], - ], - "MAT" : [ - ["AT", "@"], - ["A", "a"], - ["ALPHA", "alpha"], - ["DIPLOID", "diploid"], - ["UNKNOWN", "unknown"] - ], - "OLIGO_ORGANISM" : [ - ["BMV", "BMV"], - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"], - ["HIV1", "HIV-1"], - ["CELEGANS", "C.elegans"], - ["MYCOPLASMA", "mycoplasma"] - ], - "OLIGO_GRADE" : [ - ["DESALTED", "desalted"], - ["HPLC", "hplc"], - ["PURITY", "purity"], - ["UNKNOWN", "?"] - ], - "PRIMER_POSITION" : [ - ["FORWARD", "forward"], - ["REVERSE", "reverse"] - ], - "OLIGO_COMPANY" : [ - ["MWG", "MWG"], - ["BIG", "BIG"], - ["PHARMACIA", "Pharmacia"], - ["IGLOI", "Igloi"], - ["INVITROGEN", "invitrogen"], - ["MICROSYNTH", "microsynth"] - ], - "OLIGO_USAGE" : [ - ["PCR", "pcr"], - ["SEQUENCING", "sequencing"], - ["HYBRIDIZE", "hybridize"], - ["MUTAGENESIS", "mutagenesis"], - ["RT-PCR", "Real-Time PCR"] - ], - "RESTRICTION" : [ - ["AATII", "AatII"], - ["ACCI", "AccI"], - ["ACII", "AciI"], - ["AFLII", "AflII"], - ["AFLIII", "AflIII"], - ["AGEI", "AgeI"], - ["ALUI", "AluI"], - ["ALWI", "AlwI"], - ["ALWNI", "AlwNI"], - ["APAI", "ApaI"], - ["APALI", "ApaLI"], - ["APOI", "ApoI"], - ["ASCI", "AscI"], - ["ASEI", "AseI"], - ["AVAI", "AvaI"], - ["AVAII", "AvaII"], - ["AVRII", "AvrII"], - ["BAMHI", "BamHI"], - ["BANI", "BanI"], - ["BANII", "BanII"], - ["BBSI", "BbsI"], - ["BBVI", "BbvI"], - ["BCGI-1", "BcgI-1"], - ["BCGI-2", "BcgI-2"], - ["BCLI", "BclI"], - ["BFAI", "BfaI"], - ["BGLI", "BglI"], - ["BGLII", "BglII"], - ["BLPI", "BlpI"], - ["BPMI", "BpmI"], - ["BSAAI", "BsaAI"], - ["BSABI", "BsaBI"], - ["BSAHI", "BsaHI"], - ["BSAI", "BsaI"], - ["BSAJI", "BsaJI"], - ["BSAWI", "BsaWI"], - ["BSERI", "BseRI"], - ["BSGI", "BsgI"], - ["BSIEI", "BsiEI"], - ["BSIHKAI", "BsiHKAI"], - ["BSIWI", "BsiWI"], - ["BSLI", "BslI"], - ["BSMAI", "BsmAI"], - ["BSMBI", "BsmBI"], - ["BSMFI", "BsmFI"], - ["BSMI", "BsmI"], - ["BSOFI", "BsoFI"], - ["BSP1286I", "Bsp1286I"], - ["BSPEI", "BspEI"], - ["BSPHI", "BspHI"], - ["BSPMI", "BspMI"], - ["BSRBI", "BsrBI"], - ["BSRDI", "BsrDI"], - ["BSRFI", "BsrFI"], - ["BSRGI", "BsrGI"], - ["BSRI", "BsrI"], - ["BSSHII", "BssHII"], - ["BST1107I", "Bst1107I"], - ["BSTBI", "BstBI"], - ["BSTEII", "BstEII"], - ["BSTNI", "BstNI"], - ["BSTUI", "BstUI"], - ["BSTXI", "BstXI"], - ["BSTYI", "BstYI"], - ["BSU36I", "Bsu36I"], - ["CAC8I", "Cac8I"], - ["CLAI", "ClaI"], - ["CVIJI", "CviJI"], - ["DDEI", "DdeI"], - ["DPNI", "DpnI"], - ["DRAI", "DraI"], - ["DRAIII", "DraIII"], - ["DRDI", "DrdI"], - ["DSAI", "DsaI"], - ["EAEI", "EaeI"], - ["EAGI", "EagI"], - ["EAM1105I", "Eam1105I"], - ["EARI", "EarI"], - ["ECO47III", "Eco47III"], - ["ECO57I", "Eco57I"], - ["ECONI", "EcoNI"], - ["ECOO109I", "EcoO109I"], - ["ECORI", "EcoRI"], - ["ECORV", "EcoRV"], - ["FOKI", "FokI"], - ["FSEI", "FseI"], - ["FSPI", "FspI"], - ["HAEII", "HaeII"], - ["HAEIII", "HaeIII"], - ["HGAI", "HgaI"], - ["HHAI", "HhaI"], - ["HINCII", "HincII"], - ["HINDIII", "HindIII"], - ["HINFI", "HinfI"], - ["HPAI", "HpaI"], - ["HPAII", "HpaII"], - ["HPHI", "HphI"], - ["KPNI", "KpnI"], - ["MAEII", "MaeII"], - ["MAEIII", "MaeIII"], - ["MBOI", "MboI"], - ["MBOII", "MboII"], - ["MLUI", "MluI"], - ["MNLI", "MnlI"], - ["MSCI", "MscI"], - ["MSEI", "MseI"], - ["MSLI", "MslI"], - ["MSPA1I", "MspA1I"], - ["MUNI", "MunI"], - ["MWOI", "MwoI"], - ["NAEI", "NaeI"], - ["NARI", "NarI"], - ["NCII", "NciI"], - ["NCOI", "NcoI"], - ["NDEI", "NdeI"], - ["NHEI", "NheI"], - ["NLAIII", "NlaIII"], - ["NLAIV", "NlaIV"], - ["NOTI", "NotI"], - ["NRUI", "NruI"], - ["NSII", "NsiI"], - ["NSPI", "NspI"], - ["PACI", "PacI"], - ["PFLMI", "PflMI"], - ["PLEI", "PleI"], - ["PMEI", "PmeI"], - ["PMLI", "PmlI"], - ["PPUMI", "PpuMI"], - ["PSHAI", "PshAI"], - ["PSP1406I", "Psp1406I"], - ["PSTI", "PstI"], - ["PVUI", "PvuI"], - ["PVUII", "PvuII"], - ["RSAI", "RsaI"], - ["RSRII", "RsrII"], - ["SACI", "SacI"], - ["SACII", "SacII"], - ["SALI", "SalI"], - ["SAPI", "SapI"], - ["SAU96I", "Sau96I"], - ["SCAI", "ScaI"], - ["SCRFI", "ScrFI"], - ["SEXAI", "SexAI"], - ["SFANI", "SfaNI"], - ["SFCI", "SfcI"], - ["SFII", "SfiI"], - ["SGFI", "SgfI"], - ["SGRAI", "SgrAI"], - ["SMAI", "SmaI"], - ["SNABI", "SnaBI"], - ["SPEI", "SpeI"], - ["SPHI", "SphI"], - ["SRFI", "SrfI"], - ["SSE8387I", "Sse8387I"], - ["SSPI", "SspI"], - ["STUI", "StuI"], - ["STYI", "StyI"], - ["SWAI", "SwaI"], - ["TAQI", "TaqI"], - ["TFII", "TfiI"], - ["TSP45I", "Tsp45I"], - ["TSP509I", "Tsp509I"], - ["TTH111I", "Tth111I"], - ["XBAI", "XbaI"], - ["XCMI", "XcmI"], - ["XHOI", "XhoI"], - ["XMNI", "XmnI"], - ["SACI_NHEI", "sacI NheI"], - ["XMAI", "XmaI"], - ["BAMHI", "BamHI"], - ["CLAI", "ClaI"], - ["PACI", "PacI"], - ["NOTI", "NotI"], - ["SALI", "SalI"], - ["XHOI", "XhoI"], - ["NONE", "none"] - ], - "BACKBONE" : [ - ["PCDNA3", "pCDNA3"], - ["PABES-NEO2000", "pABES-neo 2000"], - ["PUC19", "pUC 19"], - ["PMX-1", "pMX-1"], - ["PRMHA-3", "pRmHa-3"] - ], - "BACTERIAL_HOST" : [ - ["DH10B", "DH10B"], - ["JM110", "JM110"], - ["BL21", "BL21"], - ["DH5A", "DH5a"], - ["PB3", "PB3"], - ["DB31", "DB3.1"], - ["CCDB_SURVIVAL", "ccdB survival"] - ], - "BIOSAFETY_LEVEL" : [ - ["S1", "S1"], - ["S2", "S2"], - ["S3", "S3"] - ], - "SELECTION_IN_BACTERIA" : [ - ["AMPICILLIN", "Ampicillin"], - ["KANAMYCIN", "Kanamycin"], - ["SPECTINOMCIN", "Spectinomcin"], - ["UNKNOWN", "Unknown"] - ], - "SELECTION_IN_EUKARYOTES" : [ - ["G418_NEO", "G418/neo"], - ["MPA", "MPA"], - ["HYGROMYCIN", "Hygromycin"] - ], - "SOURCE_OF_REPLICON" : [ - ["CMV", "CMV"] - ], - "PLASMID_ORGANISM" : [ - ["HUMAN", "human"], - ["MOUSE", "mouse"], - ["RAT", "rat"], - ["XENOPUS", "xenopus"], - ["DROSOPHILA", "drosophila"], - ["YEAST", "yeast"], - ["ECOLI", "E.coli"], - ["SYNTHETIC", "synthetic"] - ], - "PROMOTER" : [ - ["ENDOGENOUS", "endogenous"], - ["GAL1", "gal1"], - ["GALL", "galL"], - ["GALS", "galS"], - ["TET", "tet"], - ["ADH", "adh"], - ["CYC", "cyc"], - ["GPD", "gpd"], - ["DASH", "\"-\""], - ["CMV", "cmv"], - ["SV40", "SV40"], - ["TET_ON", "tet on"], - ["TET_OFF", "tet off"], - ["RIM1", "rim1"] - ], - "EXON_OR_THREE_PRIME" : [ - ["EXON", "exon"], - ["3P", "3'"], - ["5P", "5'"] - ], - "SIRNA_SPECIES" : [ - ["HUMAN", "Human"], - ["MOUSE", "Mouse'"], - ], - "SIRNA_COMPANY" : [ - ["AMBION", "Ambion"], - ["DHARMACON", "Dharmacon'"], - ["INVITORGEN", "Invitrogen'"], - ["MICROSYNTH", "Microsynth'"], - ["QIAGEN", "Qiagen'"], - ["GIFT", "Gift'"] - ], - "SIRNA_FREEZER_LOCATION" : [ - ["BIGLABFREEZER", "BigLab freezer"], - ["SMALLLAB_BIGFREEZER", "SmallLab Big freezer'"], - ["FREEZER_G17", "Freezer G17'"], - ["G93-FRANK", "G9.3--Frank'"], - ["FREEZER-G17_BOX_NATHALIE", "Freezer G17 Box Nathalie'"], - ["BOX-THIBAULT-BIGFREEZER-SMALLLAB", "Box thibault Big freezer small lab'"], - ["BOX-NATHALIE", "Box Nathalie'"] - ], - "TRANSFECTION_AGENT" : [ - ["FUGENE", "Fugene"], - ["LIPOFECTAMINE", "Lipofectamine'"], - ["OLIGOFECTAMINE", "Oligofectamine'"], - ["RNAIMAX", "RNAimax'"] - ], - "FREEZER" : [ - ["G9_FRIDGE-1", "G9 Fridge 1"], - ["G9_FRIDGE-2", "G9 Fridge 2"], - ["G9_FREEZER-A", "-20C Small Peter Lab"], - ["G9_FREEZER-B", "G9 Freezer B"], - ["G9_FREEZER-C", "G9 Freezer C"], - ["G10_FREEZER-D", "G10 Freezer D"], - ["G10_FREEZER-E", "G10 Freezer E"], - ["G10_FREEZER-F", "G10 Freezer F"], - ["G10_FREEZER-G", "G10 Freezer G"], - ["G10_FREEZER-H", "G10 Freezer H"], - ["G10_FREEZER-I", "G10 Freezer I"], - ["G10_FRIDGE-3", "+4C Big Peter Lab"], - ["G10_FRIDGE-4", "G10 Fridge 4"], - ["G10_FRIDGE-5", "G10 Fridge 5"], - ["G10_FRIDGE-6", "G10 Fridge 6"], - ["G10_FRIDGE-7", "G10 Fridge 7"], - ["G11_FRIDGE-8", "G10 Fridge 8"], - ["G14_FREEZER-J", "G14 Freezer J"], - ["G14_FREEZER-K", "G14 Freezer K"], - ["G14_FREEZER-L", "G14 Freezer L"], - ["G14_FREEZER-M", "G14 Freezer M"], - ["G14_FRIDGE-9", "G14 Fridge 9"], - ["G14_FRIDGE-10", "G14 Fridge 10"], - ["G17_FRIDGE-11", "G17 Fridge 11"], - ["G17_FRIDGE-12", "G17 Fridge 12"], - ["G17_FREEZER-N", "G17 Freezer N"], - ["USER_BENCH-20", "Bench -20�C"], - ["USER_BENCH-80", "Bench -80�C"], - ["USER_BENCH-RT", "Bench RT"], - ["USER_BENCH", "Bench"] - ] - } \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/README.txt b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/README.txt deleted file mode 100644 index 362ec1523649c2e1a69d9d39d12c0c6ca1751ed9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/README.txt +++ /dev/null @@ -1,8 +0,0 @@ -Steps for migration: - -1) run migration script -2) in standard UI, use sample browser and browse for: - a. Plasmids. Export code, parents, Plasmid Parents - b. Strains. Export code, parents and Derived From - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/fm11_odbc_jdbc_guide_en.pdf b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/fm11_odbc_jdbc_guide_en.pdf deleted file mode 100644 index 36aaa0f12220dbde26b7ece4e3b78914087893b0..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/doc/fm11_odbc_jdbc_guide_en.pdf and /dev/null differ diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/FileMakerMain.java deleted file mode 100644 index a2206338c1ccb79267396fbe2751fbb529304ab8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/FileMakerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - - -// STEP By Step: -// 1. Open the file maker file with file maker pro -// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on -// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" -// Without closing file maker pro you can run this script, modify it as needed -// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf - -public class FileMakerMain -{ - // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this - public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; - public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; - - static class Document { - String fileName; - String info; - String serial; - - public String toString() - { - return fileName + " " + info; - } - } - - public static List<Document> getDocuments(Connection connection) throws SQLException { - List<Document> documents = new ArrayList<Document>(); - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); - ResultSet result = preparedStatement.executeQuery(); - - while(result.next()) { - Document document = new Document(); - document.fileName = result.getString("fileName"); - document.info = result.getString("info"); - document.serial = result.getString("serial"); - documents.add(document); - } - result.close(); - preparedStatement.close(); - return documents; - } - - public static byte[] getFile(Connection connection, Document document) throws SQLException { - byte[] bytes = {}; - PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); - preparedStatement.setString(1, document.serial); - ResultSet result = preparedStatement.executeQuery(); - if(result.next()) { - byte[] value = result.getBytes("fileData"); - if(value != null) { - bytes = value; - } - } - result.close(); - preparedStatement.close(); - return bytes; - } - - public static void main(String[] args) throws Exception { - Class.forName("com.filemaker.jdbc.Driver").newInstance(); - Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); - - for(Document document: getDocuments(connection)) { - byte[] bytes = getFile(connection, document); - System.out.println(document + " " + bytes.length); - } - connection.close(); - } -} diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/fmjdbc.jar b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/fmjdbc.jar deleted file mode 100644 index 34cae1d60b916205b9039fe765c971229cef1a32..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/lib/fmjdbc.jar and /dev/null differ diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/migration.py b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/migration.py deleted file mode 100644 index 78da244ff12b79ba14152d658b83c3d9edf51028..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/migration.py +++ /dev/null @@ -1,709 +0,0 @@ -# some_file.py -import sys -import traceback -import definitions -import definitionsVoc -import re -import random -from datetime import datetime -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -import java.lang.Class as Class -import java.sql.DriverManager as DriverManager - -## -## Generic Process Method -## -notMigratedEntities = { - "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} - } - -def getStringValueOrNone(map, key): - if (key in map) and (map[key] is not None) and (map[key] is not ""): - return map[key]; - else: - return None; - -def addNotMigratedEntity(type, entityID, error): - if type not in notMigratedEntities: - notMigratedEntities[type] = {} - if entityID not in notMigratedEntities[type]: - notMigratedEntities[type][entityID] = {} - if error not in notMigratedEntities[type][entityID]: - notMigratedEntities[type][entityID][error] = 1 - else: - notMigratedEntities[type][entityID][error] += 1 - -def printNotMigratedEntities(): - print "--- Not Migrated Entities Report" - for type in notMigratedEntities: - print "Type: [" + str(type) + "]" - for id in notMigratedEntities[type]: - for error in notMigratedEntities[type][id]: - print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) - print "---" - -def process(tr): - print "START!" - createDataHierarchy(tr) - for adaptor in adaptors: - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" - while adaptor.next(): - entity = adaptor.getEntity() - print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" - try: - if not entity.isInOpenBIS(tr): - entity.write(tr) - #print entity.getIdentifier(tr) + " - Updated" - else: - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") - except Exception, error: - print traceback.format_exc() - addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) - #print entity.getIdentifier(tr) + " - Already up to date" - print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" - print "REPORT START" - printNotMigratedEntities() - definitionsVoc.printCreatedTerms() - print "REPORT FINISH" - print "FINISH!" - -## -## Help Methods -## -def setEntityProperties(tr, definition, entity, properties): - for origPropertyCode, propertyValue in properties.iteritems(): - #print repr("setEntityProperties " + origPropertyCode + " : " + unicode(propertyValue)) - propertyCode = origPropertyCode; - if propertyCode.startswith("+"): - propertyCode = propertyCode[1:]; - elif propertyCode.startswith("-"): - continue - - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, origPropertyCode) -# print "Prop definition ", propertyDefinition -# print "PROP VALUE ", propertyValue - if propertyDefinition is not None and propertyValue is not None: - propertyValue = unicode(propertyValue) - - - - - if propertyDefinition is not None and propertyDefinition[3] == DataType.REAL and propertyValue is not None: - if propertyValue =="?": - propertyValue="" - - if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue - else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 50: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - if (propertyDefinition is not None) and (len(propertyDefinition) >= 2) and (propertyDefinition[2] == "pKW Number") and (propertyValue is not None): - propertyValue = "pKW" + propertyValue - - if (propertyDefinition is not None) and (len(propertyDefinition) >= 2) and propertyDefinition[2] == "emtpy?": - if propertyValue == "empty": - propertyValue = "true" - - - if (propertyDefinition is not None) and (len(propertyDefinition) >= 2) and propertyDefinition[2] == "UC Number" and (propertyValue is not None): - if re.search("US", propertyValue): - propertyValue =propertyValue.replace("US", "UC").strip(" ") - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - - - if (propertyDefinition is not None) and (len(propertyDefinition) >= 3) and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: - possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) - if possiblePropertyValue is not None: - propertyValue = possiblePropertyValue.strip(" ") - else: - #print "MISSING VALUE for: ", propertyDefinition[0], ": VALUE ", propertyValue, "POSS VALUE:", possiblePropertyValue - - if propertyDefinition[0] =="BACTERIAL_STRAIN" and propertyValue is not None: - if propertyValue == "XL10 Gold": - entity.setPropertyValue("BACTERIAL_STRAIN", "XL10-GOLD") - elif propertyValue =="STABL2": - entity.setPropertyValue("BACTERIAL_STRAIN", "STBL2") - elif propertyValue =="E. coli": - entity.setPropertyValue("BACTERIAL_STRAIN", "E_COLI") - elif propertyValue == "?": - entity.setPropertyValue("BACTERIAL_STRAIN", "UNKNOWN") - else: - #We rely on the Add Hock Terms if is None, since there is no API we create a new one - #Create new vocabulary term - codeToUse = re.sub(r'\W+','_',propertyValue) - labelToUse = propertyValue - if len(codeToUse) is 0: - codeToUse = "None" + str(random.random()) - if len(codeToUse) > 50: - codeToUse = codeToUse[:50] - #Uses new vocabulary term - newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) - propertyValue = newTerm.getCode() - print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" - - elif propertyDefinition[0] =="DRUG_RES" and propertyValue is not None: - if propertyValue == "CAM ": - print "CAM IS:", propertyValue - entity.setPropertyValue("DRUG_RES", "CAM") - else: - entity.setPropertyValue("DRUG_RES", propertyValue) - - - - - if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set - entity.setPropertyValue(propertyCode, propertyValue) - - - - -def setPlasmidParents(tr, definition, entity, properties): - for propertyCode, propertyValue in properties.iteritems(): - - propertyDefinition = definitions.getPropertyDefinitionByCode(definition, propertyCode) - if (propertyDefinition is not None) and ((propertyDefinition[0] == "PCR_3_OLIGO" and propertyValue is not None) or (propertyDefinition[0] == "PCR_5_OLIGO" and propertyValue is not None)): - - - # if propertyValue is not None and propertyDefinition[0] == "PCR_3_OLIGO" or propertyDefinition[0] == "PCR_5_OLIGO": - propertyValue = unicode(propertyValue) - if re.match ("UC# ", propertyValue) and not re.search("/", propertyValue): - parentCode = "/MATERIALS/"+ propertyValue.replace("UC# ", "UC").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC#", propertyValue) and not re.search("/", propertyValue): - parentCode= "/MATERIALS/"+ propertyValue.replace("UC#", "UC").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC #", propertyValue) and not re.search("/", propertyValue): - parentCode= "/MATERIALS/"+ propertyValue.replace("UC #", "UC").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC ", propertyValue) and not re.search("/", propertyValue): - parentCode="/MATERIALS/"+ propertyValue.replace("UC ", "UC").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC1388cc", propertyValue): - parentCode="/MATERIALS/"+ propertyValue.replace("UC1388cc", "UC1388").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC2396c", propertyValue): - parentCode="/MATERIALS/"+ propertyValue.replace("UC2396c", "UC2396").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("UC", propertyValue) and not re.search("/", propertyValue): - parentCode= "/MATERIALS/"+ propertyValue.strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("CH", propertyValue): - parentCode="/MATERIALS/"+ propertyValue.strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - elif re.match ("Ch", propertyValue): - parentCode="/MATERIALS/"+ propertyValue.replace("Ch", "CH").strip(" ") - currentParentsList = entity.getParentSampleIdentifiers() - currentParentsList.add(parentCode) - entity.setParentSampleIdentifiers(currentParentsList) - else: - print "PARENT NOT SET: ", propertyDefinition[0] , propertyValue - - - - -## -## Generic Pattern -## -class EntityAdaptor: - entities = None - entitiesIdx = None - definition = None - definitionRepeats = None - - def init(self): - self.entities = [] - self.entitiesIdx = -1 - pass - - def next(self): - if self.entities is None and self.entitiesIdx is None: - self.init() - self.entitiesIdx += 1 - if len(self.entities) > self.entitiesIdx: - return True - else: - return False - - def addEntity(self, values): - self.entities.append(OpenBISDTO(values, self.definition)) - - def getEntity(self): - return self.entities[self.entitiesIdx] - -class OpenBISDTO: - values = {} - definition = None - - def __init__(self, values, definition): - self.values = values - self.definition = definition - - def getIdentifier(self, tr): - pass - - def isInOpenBIS(self, tr): - pass - - def write(self, tr): - pass - -## -## Costumer specific logic: generic part -## -experimentCache = {} -sampleCache = {} -sampleID2Sample = {} -globalSequences = {}; - -def getNextGlobalSequence(id): - currentSequence = None; - - if id in globalSequences: - currentSequence = globalSequences[id]; #Get existing sequence - else: - currentSequence = 0; # Create a new one - - #Advance and store new step on the sequence - currentSequence = currentSequence+1; - globalSequences[id] = currentSequence; - - #Return the new sequence number - return str(currentSequence); - -def getExperimentForUpdate(experimentIdentifier, experimentType, tr): - experimentType ="MATERIAL" - if experimentIdentifier not in experimentCache: - print "Cache failed " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.getExperimentForUpdate(experimentIdentifier) - if experiment is None and experimentType is not None: - print "Cache Create " + experimentIdentifier + ":" + str(experimentType) - experiment = tr.createNewExperiment(experimentIdentifier, experimentType) - if experiment is not None: - experimentCache[experimentIdentifier] = experiment - else: - pass - #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) - if experimentIdentifier not in experimentCache: - return None - else: - return experimentCache[experimentIdentifier] - -def getSampleForUpdate(sampleIdentifier, sampleType, tr): - if sampleIdentifier not in sampleCache: - #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) - sample = tr.getSampleForUpdate(sampleIdentifier) - if sample is None and sampleType is not None: - #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) - if sampleType == "ANTIBODY": - experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/ANTIBODY_COLLECTION", sampleType, tr) - elif sampleType == "STRAIN": - experiment = getExperimentForUpdate("/MATERIALS/STRAINS/YEAST_STRAINS", sampleType, tr) - elif sampleType == "PLASMID": - experiment = getExperimentForUpdate("/MATERIALS/PLASMIDS/PLASMID_COLLECTION_1", sampleType, tr) - elif sampleType == "CHEMICAL": - experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/CHEMICAL_COLLECTION", sampleType, tr) - elif sampleType == "RESTRICTION_ENZYME": - experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/RESTRICTION_ENZYME_COLLECTION", sampleType, tr) - elif sampleType == "OLIGO": - experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1", sampleType, tr) - sample = tr.createNewSample(sampleIdentifier, sampleType) - sample.setExperiment(experiment) - if sample is not None: - sampleCache[sampleIdentifier] = sample - else: - pass - #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) - - if sampleIdentifier not in sampleCache: - return None - else: - return sampleCache[sampleIdentifier] - -class FileMakerEntityAdaptor(EntityAdaptor): - connection = None - selectQuery = None - selectQueryRepetitions = None; - selectQueryRepetitionsId = None; - - def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): - Class.forName("com.filemaker.jdbc.Driver").newInstance() - self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) - - def init(self): - EntityAdaptor.init(self) - - # Default Query (All adaptors should have it) - preparedStatement = self.connection.prepareStatement(self.selectQuery) - #print "EXECUTED QUERY: " + self.selectQuery - result = preparedStatement.executeQuery() - - while result.next(): - values = {} - for property in self.definition: - if property[0].startswith("+"): - pass #Do Nothing - elif property[0]=="ANNOTATIONS_STATE": - values[property[0]] = ""; - else: - propertyCode = property[0]; - propertyValue = result.getString(property[2]); - if property[0].startswith("+"): - propertyCode = property[0][1:]; - if property[0].startswith("-"): - propertyCode = property[0][1:]; - values[propertyCode] = result.getString(property[2]) - self.addEntity(values) - result.close() - preparedStatement.close() - # Repetitions Query (Optional) - - #Extra Repeats Logic - if self.definitionRepeats is not None: - fields = ""; - fieldsNames = []; - isFirst = True; - for field in self.definitionRepeats: - propertyCode = field[0]; - if propertyCode.startswith("+"): - continue - - if not isFirst: - fields = fields + ", "; - - fields = fields + field[2]; - fieldsNames.append(propertyCode); - isFirst = False; - - for entity in self.entities: - entityId = entity.values[self.selectQueryRepetitionsId]; - if entityId is not None: - perEntityQuery = "SELECT " + fields + " FROM " + self.selectQueryRepetitions + "= '" + entityId + "'"; - #print "EXECUTED QUERY: " + perEntityQuery - preparedStatement = self.connection.prepareStatement(perEntityQuery) - result = preparedStatement.executeQuery() - - columnCount = result.getMetaData().getColumnCount(); - while result.next(): - for cIdx in range(columnCount): - if cIdx is not 0: - columName = result.getMetaData().getColumnName(cIdx); - fieldName = fieldsNames[cIdx]; - entity.values[fieldName] = result.getString(cIdx); - result.close() - preparedStatement.close() - # - -## -## Customer specific logic: different sample types -## -class FMOpenBISDTO(OpenBISDTO): - def isSampleCacheable(self): - return True - - def isInOpenBIS(self, tr): - code = self.getIdentifier(tr) - if (code is not None) and (' ' not in code): - if self.isSampleCacheable(): - sampleID2Sample[self.values["NAME"]] = self.values - sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) - return False - else: - print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" - raise Exception('Invalid Code found ' + str(code)) - -## -## Antibodies -## - -class AntibodyAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"Weis Lab Antibodies\"" - self.definition = definitions.antibodyDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(AntibodyOpenBISDTO(values, self.definition)) - - -class AntibodyOpenBISDTO(FMOpenBISDTO): - def isSampleCacheable(self): - return False - - def write(self, tr): - if self.values["REF_NUM"] is not None: - code = "AB" + self.values["REF_NUM"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"ANTIBODY", tr) - setEntityProperties(tr, self.definition, sample, self.values); - else: - print "Sample ", self.values["REF_NUM"], " does not have a REF_NUM" - - def getIdentifier(self, tr): - if self.values["REF_NUM"]: - code = "AB"+ self.values["REF_NUM"] - return code - - - -## -## Strains -## -class StrainAdaptor(FileMakerEntityAdaptor): - def init(self): - self.definition = definitions.strainDefinition - self.selectQuery = "SELECT * FROM \"Weis Lab Yeast Strains\""; - - #Extra Repeats Logic - self.definitionRepeats = definitions.strainDefinitionRepetitions - self.selectQueryRepetitions = " \"Weis Lab Yeast Strains\" WHERE \"KWY number\" "; - self.selectQueryRepetitionsId = "NAME" - # - - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(StrainOpenBISDTO(values, self.definition)) - -class StrainOpenBISDTO(FMOpenBISDTO): - def write(self, tr): - #print str(self.values) - #Build special properties programmatically - # TO-DO Tomorrow - - genotype = ""; - #1. Set the mat if present - if getStringValueOrNone(self.values, "MAT") is not None: -# genotype = "MAT " + self.values["MAT"] + " "; - - if self.values["MAT"] == "a": - self.values["MAT"] ="alpha" - genotype = "MAT " + self.values["MAT"] + " "; - elif self.values["MAT"] == "a/A": - self.values["MAT"] ="alpha/A" - genotype = "MAT " + self.values["MAT"] + " "; - elif self.values["MAT"] == "a/a": - self.values["MAT"] = "alpha/alpha" - genotype = "MAT " + self.values["MAT"] + " "; - else: - genotype = "MAT " + self.values["MAT"] + " "; - - - #2. Add unmarked mutations - for cIdx in range(1, 6): - if getStringValueOrNone(self.values, "-UNMARKED_MUTATIONS_" + str(cIdx)) is not None: - genotype = genotype + self.values["-UNMARKED_MUTATIONS_" + str(cIdx)] + " "; - - #3. Add pairs of disruptions and markers - for cIdx in range(1, 6): - disruption = getStringValueOrNone(self.values, "-DISRUPTIONS_" + str(cIdx)); - marker = getStringValueOrNone(self.values, "-MARKERS_" + str(cIdx)); - - if (disruption is not None) or (marker is not None): - if (disruption is not None): - genotype = genotype + disruption +"::"; - #genotype = genotype + " "; - - if (marker is not None): - genotype = genotype + marker; - genotype = genotype + " "; - - self.values["+GENOTYPE"] = genotype - # -# print "GENOTYPE : ", str(self.values["+GENOTYPE"]) - #Write properties - code = self.values["NAME"] - sample = getSampleForUpdate("/MATERIALS/"+code,"STRAIN", tr) - setEntityProperties(tr, self.definition, sample, self.values) - - def getIdentifier(self, tr): - return self.values["NAME"] - -## -## Plasmids -## -class PlasmidAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"Weis Lab Plasmids\"" - self.definition = definitions.plasmidDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(PlasmidOpenBISDTO(values, self.definition)) - -class PlasmidOpenBISDTO(FMOpenBISDTO): - def write(self, tr): - code = "PKW" + self.values["NAME"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"PLASMID", tr) - setEntityProperties(tr, self.definition, sample, self.values) - setPlasmidParents(tr, self.definition, sample, self.values) - #print "SETPARENTS", setPlasmidParents(tr, self.definition, sample, self.values) - else: - print "PLASMID CODE NOT FOUND! " - - def getIdentifier(self, tr): - code = "PKW" +self.values["NAME"] - return code - - - -## -## Oligos -## -class OligoAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"WLO\"" - self.definition = definitions.oligoDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(OligoOpenBISDTO(values, self.definition)) - -class OligoOpenBISDTO(FMOpenBISDTO): - def write(self, tr): - code = self.values["NAME"] - if code is not None: - if re.search("CHCH", code): - code = code.replace("CHCH", "CH") - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - elif re.search("CH", code): - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - elif re.search("US", code): - code = code.replace("US", "UC") - sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) - setEntityProperties(tr, self.definition, sample, self.values); - else: - print "OLIGO CODE NOT FOUND! " - - def getIdentifier(self, tr): - code = self.values["NAME"] - return code - - - -## -## Chemical -## -class ChemicalAdaptor(FileMakerEntityAdaptor): - - def init(self): - self.selectQuery = "SELECT * FROM \"Table\"" - self.definition = definitions.chemicalDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(ChemicalOpenBISDTO(values, self.definition)) - - -class ChemicalOpenBISDTO(FMOpenBISDTO): - def isSampleCacheable(self): - return False - - def write(self, tr): - code = "CHEM" + self.values["ID"] - if code is not None: - sample = getSampleForUpdate("/MATERIALS/"+code,"CHEMICAL", tr) - setEntityProperties(tr, self.definition, sample, self.values); - else: - print "CHEMICAL CODE NOT FOUND!" - - def getIdentifier(self, tr): - code = "CHEM" + self.values["ID"] - return code - -## -## Restriction enzymes -## -class EnzymeAdaptor(FileMakerEntityAdaptor): - def init(self): - self.selectQuery = "SELECT * FROM \"Restriction_Enzymes\"" - - self.definition = definitions.RestrictionEnzymeDefinition - FileMakerEntityAdaptor.init(self) - - def addEntity(self, values): - self.entities.append(EnzymeOpenBISDTO(values, self.definition)) - -class EnzymeOpenBISDTO(FMOpenBISDTO): - - def isSampleCacheable(self): - return False - - def write(self, tr): - code = self.getIdentifier(tr); - print "New Code To Be Written: " + code - sample = getSampleForUpdate("/MATERIALS/"+code,"RESTRICTION_ENZYME", tr) - setEntityProperties(tr, self.definition, sample, self.values); - - def getIdentifier(self, tr): - if "CODE" not in self.values: - self.values["CODE"] = "RE" + getNextGlobalSequence("RE"); - print "New Code Generated: " + self.values["CODE"] - return self.values["CODE"]; - - - -fmConnString = "jdbc:filemaker://127.0.0.1/" -#fmConnString = "jdbc:filemaker://fmsrv.ethz.ch/" -fmUser= "admin" -fmPass = "nucleus" - - - -adaptors = [ - #EnzymeAdaptor(fmConnString, fmUser, fmPass, "Weis_Restriction_enzymes"), - #ChemicalAdaptor(fmConnString, fmUser, fmPass, "Weis_Chemicals"), - #AntibodyAdaptor(fmConnString, fmUser, fmPass, "Weis _Antibodies"), - #OligoAdaptor(fmConnString, fmUser, fmPass, "Weis_Oligos"), - #PlasmidAdaptor(fmConnString, fmUser, fmPass, "Weis_Plasmids"), - StrainAdaptor(fmConnString, fmUser, fmPass, "Weis_Yeast_Strains") - ] - - -def createDataHierarchy(tr): - inventorySpace = tr.getSpace("MATERIALS") - if inventorySpace == None: - tr.createNewSpace("MATERIALS", None) - tr.createNewProject("/MATERIALS/REAGENTS") - tr.createNewProject("/MATERIALS/POLYNUCLEOTIDES") - tr.createNewProject("/MATERIALS/PLASMIDS") - tr.createNewProject("/MATERIALS/STRAINS") - - \ No newline at end of file diff --git a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/plugin.properties b/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/plugin.properties deleted file mode 100644 index 238e3eb903c49960826af70ba5a6983b7836c480..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/weismigration/1/dss/drop-boxes/weismigration/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -## -## Defaults -## -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -script-path = migration.py -dropbox-name = weismigration -incoming-dir = ${root-dir}/weismigration \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-body-style.css deleted file mode 100644 index 1688cc851aa61c09580ff17f03615e3c92c09d01..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-body-style.css +++ /dev/null @@ -1,130 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E0E0E0; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.antibody-table-data-cell { - overflow: hidden; - -} - - -#antibody-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#antibody-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#antibody-table tr.antibody-table-data:hover { - font-weight: bold; - -} - -#antibody-table td{ - -padding:5px; -} - -#antibody-table tr.antibody-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-browser.html deleted file mode 100644 index df1ffab4501d5bd84e03167e7e0e3454555eccdc..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/antibody-browser.html +++ /dev/null @@ -1,835 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Antibody Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="antibody-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> ANTIBODIES </div> - <div id ="sectionsContainer"><div> - - - -<!-- <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Antibody Name</td><td> <input style="width: 200px" id="antibodyName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> ---> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="antibody-table" style="float: left"> - <tr class="antibody-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>Host</th><th>For What</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All antibodys -var antibodys = null; - -/// The antibodys that are currently being inspected -var inspectedAntibodys = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT", "MATERIALS" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION","DETAILS", "EPITOPE", "CLONALITY", "ISOTYPE", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["MEMBRANE","ANTIBODY_DILUTION","ANTIBODY_SOLUTION", "COMMENTS" ] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - antibody = objectOrId; - } else { - antibody = antibodysById[objectOrId]; - } - - return antibody; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the antibodys variable */ -function initializeAntibodys(result) -{ - // Construct a map of all antibodys by id - antibodysById = {}; - - // Split the antibodys into two groups, the ones that start with FRP in their sample name and the other ones. - var frpAntibodys = [], otherAntibodys = []; - var frpRegex = /^FRAB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - antibodysById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the antibodysById map - theSample = antibodysById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpAntibodys.push(theSample); - } else { - otherAntibodys.push(theSample); - } - }); - - // Sort each of the groups - otherAntibodys.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpAntibodys.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of antibodys - antibodys = frpAntibodys.concat(otherAntibodys); -} - - - -/** Set the size of the antibody-table based on whether or not inspectors are visible */ -function resizeAntibodyTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var antibodyTableTransition = d3.selectAll('div.antibody-table-data-cell'); - antibodyTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectAntibody(antibody) -{ - if (inspectedAntibodys.indexOf(antibody) < 0) { - inspectedAntibodys.push(antibody); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var antibodyToSend = $.extend({}, antibody); - delete antibodyToSend.parents; - delete antibodyToSend.children; - openbisServer.listDataSetsForSample(antibodyToSend, true, dataset.curry(antibody)); - } - resizeAntibodyTable(); - updateInspectors(1000); -} - -function closeInspector(antibody) -{ - var index = inspectedAntibodys.indexOf(antibody); - if (index < 0) { - return; - } - - inspectedAntibodys.splice(index, 1); - resizeAntibodyTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedAntibodys, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectAntibody(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectAntibody(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeAntibodys(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (antibodys.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#antibody-table").selectAll("tr.antibody-table-data").data(antibodys); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "antibody-table-data") - .style("cursor", "pointer") - .on("click", inspectAntibody) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.HOST, sample.properties.FOR_WHAT]; }) - .enter() - .append("td") - .append("div") - .attr("class", "antibody-table-data-cell") - .text(String) - -} - -function antibodyFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#antibody-table").selectAll("tr.antibody-table-data").data(antibodys); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedAntibodys) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "ANTIBODY" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-body-style.css deleted file mode 100644 index f776a2e8e7edd15c3287b0b419a4d1c101340754..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-body-style.css +++ /dev/null @@ -1,130 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E0E0E0; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.bacteria-table-data-cell { - overflow: hidden; - -} - - -#bacteria-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#bacteria-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#bacteria-table tr.bacteria-table-data:hover { - font-weight: bold; - -} - -#bacteria-table td{ - -padding:5px; -} - -#bacteria-table tr.bacteria-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-browser.html deleted file mode 100644 index da6164d0650febd7c8dc718d305a862bc4f8356b..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/bacteria-browser.html +++ /dev/null @@ -1,831 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>bacteria Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="bacteria-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> BACTERIA </div> - <div id ="sectionsContainer"><div> - -<!-- <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">bacteria Name</td><td> <input style="width: 200px" id="bacteriaName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> ---> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="bacteria-table" style="float: left"> - <tr class="bacteria-table-header"><th>Code</th><th>Bacteria Strain Name</th><th>Bacteria Genotype</th><th>For What</th><th>Supplier</th><th>Art. Number</th><th>Comments</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All bacterias -var bacterias = null; - -/// The bacterias that are currently being inspected -var inspectedbacterias = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["BOX_NUMBER", "ROW", "COLUMN"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_lis4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - bacteria = objectOrId; - } else { - bacteria = bacteriasById[objectOrId]; - } - - return bacteria; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the bacterias variable */ -function initializebacterias(result) -{ - // Construct a map of all bacterias by id - bacteriasById = {}; - - // Split the bacterias into two groups, the ones that start with FRP in their sample name and the other ones. - var frpbacterias = [], otherbacterias = []; - var frpRegex = /^FRE[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - bacteriasById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the bacteriasById map - theSample = bacteriasById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpbacterias.push(theSample); - } else { - otherbacterias.push(theSample); - } - }); - - // Sort each of the groups - otherbacterias.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpbacterias.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of bacterias - bacterias = frpbacterias.concat(otherbacterias); -} - - - -/** Set the size of the bacteria-table based on whether or not inspectors are visible */ -function resizebacteriaTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var bacteriaTableTransition = d3.selectAll('div.bacteria-table-data-cell'); - bacteriaTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectbacteria(bacteria) -{ - if (inspectedbacterias.indexOf(bacteria) < 0) { - inspectedbacterias.push(bacteria); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var bacteriaToSend = $.extend({}, bacteria); - delete bacteriaToSend.parents; - delete bacteriaToSend.children; - openbisServer.listDataSetsForSample(bacteriaToSend, true, dataset.curry(bacteria)); - } - resizebacteriaTable(); - updateInspectors(1000); -} - -function closeInspector(bacteria) -{ - var index = inspectedbacterias.indexOf(bacteria); - if (index < 0) { - return; - } - - inspectedbacterias.splice(index, 1); - resizebacteriaTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedbacterias, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializebacterias(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (bacterias.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacterias); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "bacteria-table-data") - .style("cursor", "pointer") - .on("click", inspectbacteria) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.BACTERIA_STRAIN_NAME, sample.properties.BACTERIA_GENOTYPE, sample.properties.WHAT_FOR, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.COMMENTS]; }) - .enter() - .append("td") - .append("div") - .attr("class", "bacteria-table-data-cell") - .text(String) - -} - -function bacteriaFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, bacteriaNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (bacteriaNameFilterText == undefined) - { - bacteriaNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedbacterias = bacterias.filter(bacteriaFilter.curry(ownerFilterText, "OWNER")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(bacteriaNameFilterText, "bacteria_NAME")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(backboneFilterText, "BACKBONE")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacterias); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedbacterias) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "BACTERIA" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#bacteriaName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/base.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/base.css deleted file mode 100644 index 516b532af882fd7f6721bdda74ba2d5083fe9a72..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/base.css +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Colour dictionary: - * - * Table control elements: #719ba7 - * Header cells: #66A9BD - * Body header cells: #91c5d4 - * Body content cells: #d5eaf0 - * Body content cells (alt): #bcd9e1 - * Footer header: #b0cc7f - * Footer content: #d7e1c5 - */ - - -/* - * Page setup styles - */ -body { - font: 80%/1.45em Arial, Verdana, Helvetica, sans-serif; - margin: 0; - padding: 0; - color: #111; - background-color: #fff; -} - -#container { - margin: 0 auto; - width: 960px -} - -h1 { - text-align: center; - font-size: 1.2em; - font-weight: bold; - margin: 1em 0; -} - - -/* - * DataTables framework - */ -div.dataTables_wrapper { - background-color: #5C5C1F; -} - -div.dataTables_length { - float: left; -} - -div.dataTables_filter { - float: right; -} - -div.dataTables_info { - padding: 9px 6px 6px 6px; - float: left; -} - -div.dataTables_paginate { - float: right; -} - -div.dataTables_length, -div.dataTables_filter, -div.dataTables_paginate { - padding: 6px; -} - -/* Self clearing - http://www.webtoolkit.info/css-clearfix.html */ -.dataTables_wrapper:after { - content: "."; - display: block; - clear: both; - visibility: hidden; - line-height: 0; - height: 0; -} - -html.dataTables_wrapper { - display: block; -} - -* html .dataTables_wrapper { - height: 1%; -} - - -/* - * Table styles - */ -table.pretty { - width: 100%; - clear: both; -} - -table.pretty td, -table.pretty th { - padding: 5px; - border: 1px solid #fff; -} - -/* Header cells */ -table.pretty thead th { - text-align: center; - background: #5C5C1F; -} - -/* Body cells */ - - -table.pretty tbody td { - text-align: center; - background: #ECEFEF; -} - -table.pretty tbody tr.odd td { - background: #A6A64D; -} - -/* - * Pagination - */ -a.paginate_button, -a.paginate_active { - display: inline-block; - background-color: #ECEFEF; - padding: 2px 6px; - margin-left: 2px; - cursor: pointer; - *cursor: hand; -} - -a.paginate_active { - background-color: transparent; - border: 1px solid black; -} - -a.paginate_button_disabled { - color: #3d6672; -} -.paging_full_numbers a:active { - outline: none -} -.paging_full_numbers a:hover { - text-decoration: none; -} - -div.dataTables_paginate span>a { - width: 15px; - text-align: center; -} - - -/* - * Sorting - */ -table.pretty thead th.sorting_asc { - background: #5C5C1F url('images/sort_asc.png') no-repeat right center; -} - -table.pretty thead th.sorting_desc { - background: #5C5C1F url('images/sort_desc.png') no-repeat right center; -} - -table.pretty thead th.sorting { - background: #5C5C1F url('images/sort_both.png') no-repeat right center; -} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/body-style.css deleted file mode 100644 index 9047f06025252e7670a81c2a3747cb776a08c466..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/body-style.css +++ /dev/null @@ -1,232 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#DC7E9E; -} - -.properties td:nth-child(even) { - background-color:#ECEFEF; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} -.oligo-table-data-cell { - overflow: hidden; -} - -#oligo-table tr:nth-child(odd) { - background-color:#94B8B8; -} - -#oligo-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#oligo-table tr.oligo-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - - -#oligo-table td{ - -padding:5px; -} - -#oligo-table tr.oligo-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#426262; -} - - -.chemical-table-data-cell { - overflow: hidden; -} - -#chemical-table tr:nth-child(odd) { - background-color:#B2B2B2; -} - -#chemical-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#chemical-table tr.chemical-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - - -#chemical-table td{ - -padding:5px; -} - -#chemical-table tr.chemical-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#767676; -} - - -.plasmid-table-data-cell { - overflow: hidden; -} - -#plasmid-table tr:nth-child(odd) { - background-color:#DC7E9E; -} - -#plasmid-table tr:nth-child(even) { - background-color:#ECEFEF; -} - -#plasmid-table tr.plasmid-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - -#plasmid-table td{ - -padding:5px; -} - -#plasmid-table tr.plasmid-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#6E3F4F; -} - - - - -.yeast-table-data-cell { - overflow: hidden; -} - -#yeast-table tr:nth-child(odd) { - background-color:#A6A64D; -} - -#yeast-table tr:nth-child(even) { - background-color:#ECEFEF; - -} - -#yeast-table tr.yeast-table-data:hover { - font-size : 105%; - font-weight: bold; - -} - -#yeast-table td{ - -padding:5px; -} - -#yeast-table tr.yeast-table-header { - font-size:18px; - font-weight: bold; - color:#fff; - background-color:#5C5C1F; -} - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/buffer-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/buffer-body-style.css deleted file mode 100644 index 6040328e1d0a50dbdffd01fc2e55d02155513170..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/buffer-body-style.css +++ /dev/null @@ -1,130 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E0E0E0; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.buffer-table-data-cell { - overflow: hidden; - -} - - -#buffer-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#buffer-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#buffer-table tr.buffer-table-data:hover { - font-weight: bold; - -} - -#buffer-table td{ - -padding:5px; -} - -#buffer-table tr.buffer-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/button.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/button.css deleted file mode 100644 index 6b437a3b6acb6f81fb7b79d3208c19af17c06656..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/button.css +++ /dev/null @@ -1,427 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #0000FF ; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 40; - border-radius: 5px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: steelblue; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - - -#chemical_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#chemical_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#chemical_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - -#oligo_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#0099CC; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#oligo_browser a:visited -{ -color:#000000; -background-color:#0099CC; -} -#oligo_browser a:hover -{ -background-color:#CCFFFF; -color:#FFFFFF; -} - - -#yeast_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color: #CCCC99; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#yeast_browser a:visited -{ -color:#000000; -background-color: #CCCC99; -} -#yeast_browser a:hover -{ -background-color: #FFFFCC; -color:#FFFFFF; -} - -#plasmid_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#ffcb99; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#plasmid_browser a:visited -{ -color:#000000; -background-color:#ffcb99; -} -#plasmid_browser a:hover -{ -background-color:#ffe5cc; -color:#FFFFFF; -} - - -#antibody_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#antibody_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#antibody_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - -#protocol_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#ABBF99; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#protocol_browser a:visited -{ -color:#000000; -background-color:#ABBF99; -} -#protocol_browser a:hover -{ -background-color:#E5FFCC; -color:#FFFFFF; -} - -#media_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#media_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#media_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - - -#enzyme_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#enzyme_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#enzyme_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - - -#bacteria_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#bacteria_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#bacteria_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - -#pcr_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#ABBF99; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#pcr_browser a:visited -{ -color:#000000; -background-color:#ABBF99; -} -#pcr_browser a:hover -{ -background-color:#E5FFCC; -color:#FFFFFF; -} - - -#western_blotting_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#ABBF99; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#western_blotting_browser a:visited -{ -color:#000000; -background-color:#ABBF99; -} -#western_blotting_browser a:hover -{ -background-color:#E5FFCC; -color:#FFFFFF; -} - - -#buffer_browser a:link -{ -display:block; -font-weight:bold; -color:#000000; -background-color:#A8A8A8; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#buffer_browser a:visited -{ -color:#000000; -background-color:#A8A8A8; -} -#buffer_browser a:hover -{ -background-color:#E0E0E0; -color:#FFFFFF; -} - - -#search_browser a:link -{ -display:block; -font-weight:bold; -color:#FFFFFF; -background-color:#0000FF; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#search_browser a:visited -{ -color:#FFFFFF; -background-color:#0000FF; -} -#search_browser a:hover -{ -background-color:steelblue; -color:#FFFFFF; -} - - -#title{ - font: 35px "Trebuchet MS"; - color: #0000cc; - font-weight:bold; - text-align:center; -} - -#filter-button a:link -{ -display:block; -font-weight:bold; -color:#FFFFFF; -background-color:#0000FF; -width:120px; -text-align:center; -padding:4px; -text-decoration:none; -border: 40; -border-radius: 5px; -border-bottom: 1px solid #222; -margin: 0; -} -#filter-button a:hover -{ -background-color:steelblue; -color:#FFFFFF; -} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-body-style.css deleted file mode 100644 index 42591124c777dd6f6a0d79c6aee468a347fc2cb8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-body-style.css +++ /dev/null @@ -1,37 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} - - -.chemical-table-data-cell { - overflow: hidden; -} - -#chemical-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#chemical-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - - -#chemical-table td{ -padding:5px; -} - -#chemical-table tr.chemical-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; -} - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-browser.html deleted file mode 100644 index 70ead0aa5d1ec888cfd46ef78c96a169fe197373..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/chemical-browser.html +++ /dev/null @@ -1,540 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Chemical Browser</title> - <link type="text/css" rel="stylesheet" href="chemical-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All chemicals -var chemicals = null; - -/// The chemicals that are currently being inspected -var inspectedChemicals = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - -/** Initialize the chemicals variable */ -function initializeChemicals(result) -{ - // Split the chemicals into two groups, the ones that start with FRC in their sample name and the other ones. - var frcChemicals = [], otherChemicals = []; - var frcRegex = /^FRC[0-9]+/; - frcRegex.compile(frcRegex); - result.forEach(function(sample) { - if (frcRegex.test(sample.code)) { - frcChemicals.push(sample); - } else { - otherChemicals.push(sample); - } - }); - - // Sort each of the groups - otherChemicals.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frcChemicals.sort(function(a, b) { - // Sort based on the FRC number - var frcNumberA = parseInt(a.code.substring(3)); - var frcNumberB = parseInt(b.code.substring(3)); - return (frcNumberA < frcNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of chemicals - chemicals = frcChemicals.concat(otherChemicals); -} - -/** Set the size of the chemical-table based on whether or not inspectors are visible */ -function resizeChemicalTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - if (inspectedChemicals.length > 0) { - cellWidth = "100%"; - areInspectorsVisible = false; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var chemicalTableTransition = d3.selectAll('div.chemical-table-data-cell'); - chemicalTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectChemical(chemical) -{ - if (inspectedChemicals.indexOf(chemical) < 0) { - inspectedChemicals.push(chemical); - openbisServer.listDataSetsForSample(chemical, true, dataset.curry(chemical)); - } - resizeChemicalTable(); - updateInspectors(1000); -} - -function closeInspector(chemical) -{ - var index = inspectedChemicals.indexOf(chemical); - if (index < 0) { - return; - } - - inspectedChemicals.splice(index, 1); - resizeChemicalTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedChemicals, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -/* - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - -*/ -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeChemicals(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (chemicals.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#chemical-table").selectAll("tr.chemical-table-data").data(chemicals); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "chemical-table-data") - .on("click", inspectChemical) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.LOCAL_ID, sample.properties.STORAGE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "chemical-table-data-cell") - .text(String) -} - -function chemicalFilter(filter, property, element, index, array) { - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(nameFilterText, supplierFilterText, artnumFilterText, locidFilterText, storageFilterText) -{ - if (nameFilterText == undefined) - { - nameFilterText = ""; - } - - if (supplierFilterText == undefined) - { - supplierFilterText = ""; - } - - if (artnumFilterText == undefined) - { - artnumFilterText = ""; - } - - if (locidFilterText == undefined) - { - locidFilterText = ""; - } - - if (storageFilterText == undefined) - { - storageFilterText = ""; - } - - - - var displayedChemicals = chemicals.filter(chemicalFilter.curry(nameFilterText, "NAME")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(supplierFilterText, "SUPPLIER")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(artnumFilterText, "ARTICLE_NUMBER")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(locidFilterText, "LOCAL_ID")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(storageFilterText, "STORAGE")); - - - - - var selection2 = d3.select("#vis").select("#chemical-table").selectAll("tr.chemical-table-data").data(chemicals); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedChemicals) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "CHEMICAL" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamples(sampleCriteria, displayReturnedSamples); - -} - - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#name_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#supplier_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#artnum_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#locid_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - - $('#storage_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> CHEMICALS </div> - <div id ="sectionsContainer"><div> - <div id="filter-button" style="padding-left:400px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="position:absolute; top: 680px; left: 400px"><td style="font-weight: bold; width: 200px">Chemical Name</td><td><input style="width: 200px" id="name_filter" type="text"></td></tr> - <tr style="position:absolute; top: 720px; left: 400px"><td style="font-weight: bold; width: 200px">Supplier</td><td><input style="width: 200px" id="supplier_filter" type="text"></td></tr> - <tr style="position:absolute; top: 760px; left: 400px"><td style="font-weight: bold; width: 200px">Art. Number</td><td> <input style="width: 200px" id="artnum_filter" type="text"></td></tr> - <tr style="position:absolute; top: 800px; left: 400px"><td style="font-weight: bold; width: 200px">Local ID</td><td> <input style="width: 200px" id="locid_filter" type="text"></td></tr> - <tr style="position:absolute; top: 840px; left: 400px"><td style="font-weight: bold; width: 200px">Storage</td><td> <input style="width: 200px" id="storage_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; height: 500px; top: 100px; overflow: auto"> - <table cellspacing="10" cellpadding="20"> - <table id="chemical-table" style="float: left"> - <tr class="chemical-table-header"><th>Code</th><th>Name</th><th>Supplier</th><th>Art. Number</th><th>Local ID</th><th>Storage</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/common.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/common.js deleted file mode 100644 index dba70b6169ff008bf4330143f6413b771e32f55a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/common.js +++ /dev/null @@ -1,110 +0,0 @@ -var openbisUrl = 'https://localhost:8443/'; -var dssUrl = 'https://localhost:8444/datastore_server'; - -function dataset(sample, data) { - if(data.result){ - for (var i = 0; i < data.result.length; i++) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(sample, data.result[i])); - } - } -} - -function filelist(sample, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+sample.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - - if(pathInDataSet){ - var downloadUrl = dssUrl+"/"+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.getSession(); - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } - } -} - -// -// UI Related -// - -function createTableFromProperties() { - var tableTemplate = "<table id=\"yeast-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"1\" bordercolor=\"white\" class=\"display\" width=\"100%\"><thead><tr class=\"yeast-table-header\"><th>Code</th>"; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME.length;i++) { - tableTemplate += "<th>" + SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME[i]+ "</th>"; - } - tableTemplate += "</tr></thead><tbody></tbody></table>"; - $("#tableContainer").append(tableTemplate); -} - -function createTableFilterFromProperties() { - var PADDING = 40; - var START = 660; - - - var tableTemplate = "<table>"; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME.length;i++) { - START = START+PADDING; - tableTemplate += "<tr style=\"position:absolute; top: "+START+"px; left: 200px\"><td style=\"font-weight: bold; width: 200px\">"+SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME[i]+"</td><td><input style=\"width: 200px\" id=\""+SAMPLE_TYPE_PROPERTIES[i]+"_filter\" type=\"text\"></td></tr>"; - } - - tableTemplate += "</table>"; - $("#filterContainer").append(tableTemplate); -} - -function createVisualizeFiltersFromProperties() { - for(var i=0;i<SAMPLE_TYPE_PROPERTIES.length;i++) { - $('#'+SAMPLE_TYPE_PROPERTIES[i]+'_filter').keyup(function() { - var filterResults = []; - for(var i=0;i<SAMPLE_TYPE_PROPERTIES.length;i++) { - filterResults[i] = $('#'+SAMPLE_TYPE_PROPERTIES[i]+'_filter').val(); - } - - visualize( - filterResults - ); - }); - } -} - -function populateMenu() { - - var menu = ""; - menu += "<div id='button-group'> <button id='logout-button' style='position: absolute; right:10px; top:10px;'>Logout</button> </div>"; - menu += "<div id='search_browser' style='position: absolute; left:10px; top:100px'> <a href='search-browser.html'>Search</a> </div>"; - menu += "<div id='bacteria_browser' style='position: absolute; left:10px; top:150px'> <a href='bacteria-browser.html'>Bacteria</a> </div>"; - menu += "<div id='chemical_browser' style='position: absolute; left:10px; top:200px'> <a href='chemical-browser.html'>Chemicals</a> </div>"; - menu += "<div id='antibody_browser' style='position: absolute; left:10px; top:250px'> <a href='antibody-browser.html'>Antibodies</a> </div>"; - menu += "<div id='media_browser' style='position: absolute; left:10px; top:300px'> <a href='media-browser.html'>Media</a> </div>"; - menu += "<div id='buffer_browser' style='position: absolute; left:10px; top:350px'> <a href='solutions_buffers-browser.html'>Solutions Buffers</a> </div>"; - menu += "<div id='enzyme_browser' style='position: absolute; left:10px; top:400px'> <a href='enzyme-browser.html'>Enzymes</a> </div>"; - menu += "<div id='oligo_browser' style='position: absolute; left:10px; top:450px'> <a href='oligo-browser.html'>Oligos</a> </div>"; - menu += "<div id='plasmid_browser' style='position: absolute; left:10px; top:500px'> <a href='plasmid-browser.html'>Plasmids</a> </div>"; - menu += "<div id='yeast_browser' style='position: absolute; left:10px; top:550px'> <a href='yeast-browser.html'>Yeasts</a> </div>"; - menu += "<div id='protocol_browser' style='position: absolute; left:10px; top:600px'> <a href='general_protocol-browser.html'>General Protocols</a> </div>"; - menu += "<div id='pcr_browser' style='position: absolute; left:10px; top:650px'> <a href='pcr-browser.html'>PCR</a> </div>"; - menu += "<div id='western_blotting_browser' style='position: absolute; left:10px; top:700px'> <a href='western_blotting-browser.html'>Western Blotting</a> </div>"; - - $("#sectionsContainer").append(menu); - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); -} \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.js deleted file mode 100755 index 13abb6dbc6f9665c005209b8e09d0dc97266d1f7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.layout.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.layout.js deleted file mode 100755 index 6cc1d7161677597ae7f718a4c0cafb90a240a56a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.time.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.tsv.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.tsv.js deleted file mode 100644 index 8d9a5e4f7038bfe558e2cca878854d234b770b8d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/d3.tsv.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * TSV Parser from: - * https://github.com/vlandham/d3.tsv - */ -(function(){d3.tsv = function(url, callback) { - d3.text(url, "text/tab-separated-values", function(text) { - callback(text && d3.tsv.parse(text, "\t")); - }); -}; - -d3.tsv.version = "0.0.2" -d3.tsv.parse = function(text, separator) { - var header; - return separator && d3.tsv.parseRows(text, separator, function(row, i) { - if (i) { - var o = {}, j = -1, m = header.length; - while (++j < m) o[header[j]] = row[j]; - return o; - } else { - header = row; - return null; - } - }); -}; - -d3.tsv.parseRows = function(text, separator, f) { - var EOL = {}, // sentinel value for end-of-line - EOF = {}, // sentinel value for end-of-file - rows = [], // output rows - re = new RegExp("\r\n|[" + separator + "\r\n]", "g"), // field separator regex - separatorCode = separator.charCodeAt(0), // code to match separator with - n = 0, // the current line number - t, // the current token - eol; // is the current token followed by EOL? - - re.lastIndex = 0; // work-around bug in FF 3.6 - - /** @private Returns the next token. */ - function token() { - if (re.lastIndex >= text.length) return EOF; // special case: end of file - if (eol) { eol = false; return EOL; } // special case: end of line - - // special case: quotes - var j = re.lastIndex; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < text.length) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - i++; - } - } - re.lastIndex = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) re.lastIndex++; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, "\""); - } - - // common case - var m = re.exec(text); - if (m) { - eol = m[0].charCodeAt(0) !== separatorCode; - return text.substring(j, m.index); - } - re.lastIndex = text.length; - return text.substring(j); - } - - while ((t = token()) !== EOF) { - var a = []; - while ((t !== EOL) && (t !== EOF)) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - - return rows; -}; -d3.tsv.format = function(rows) { - return rows.map(function (row) { - return d3_formatRow(row, "\t"); - }).join("\n"); -}; - -function d3_formatRow(row, separator) { - return row.map(d3_formatValue).join(separator); -} - -function d3_formatValue(text) { - return /[",\n]/.test(text) - ? "\"" + text.replace(/\"/g, "\"\"") + "\"" - : text; -} -})(); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-body-style.css deleted file mode 100644 index 4b5724f05f824ef8e60e327320f35bac8d758941..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-body-style.css +++ /dev/null @@ -1,130 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E0E0E0; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.enzyme-table-data-cell { - overflow: hidden; - -} - - -#enzyme-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#enzyme-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#enzyme-table tr.enzyme-table-data:hover { - font-weight: bold; - -} - -#enzyme-table td{ - -padding:5px; -} - -#enzyme-table tr.enzyme-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-browser.html deleted file mode 100644 index 570fe2f3d4000852e8f8679db0b7819ac1511237..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/enzyme-browser.html +++ /dev/null @@ -1,784 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>enzyme Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="enzyme-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> ENZYMES </div> - <div id ="sectionsContainer"><div> - - -<!-- <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">enzyme Name</td><td> <input style="width: 200px" id="enzymeName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> ---> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="enzyme-table" style="float: left"> - <tr class="enzyme-table-header"><th>Code</th><th>Name</th><th>Supplier</th><th>Art. Number</th><th>Kit Including</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All enzymes -var enzymes = null; - -/// The enzymes that are currently being inspected -var inspectedenzymes = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - enzyme = objectOrId; - } else { - enzyme = enzymesById[objectOrId]; - } - - return enzyme; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the enzymes variable */ -function initializeenzymes(result) -{ - // Construct a map of all enzymes by id - enzymesById = {}; - - // Split the enzymes into two groups, the ones that start with FRP in their sample name and the other ones. - var frpenzymes = [], otherenzymes = []; - var frpRegex = /^FRE[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - enzymesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the enzymesById map - theSample = enzymesById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpenzymes.push(theSample); - } else { - otherenzymes.push(theSample); - } - }); - - // Sort each of the groups - otherenzymes.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpenzymes.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of enzymes - enzymes = frpenzymes.concat(otherenzymes); -} - - - -/** Set the size of the enzyme-table based on whether or not inspectors are visible */ -function resizeenzymeTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var enzymeTableTransition = d3.selectAll('div.enzyme-table-data-cell'); - enzymeTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectenzyme(enzyme) -{ - if (inspectedenzymes.indexOf(enzyme) < 0) { - inspectedenzymes.push(enzyme); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var enzymeToSend = $.extend({}, enzyme); - delete enzymeToSend.parents; - delete enzymeToSend.children; - openbisServer.listDataSetsForSample(enzymeToSend, true, dataset.curry(enzyme)); - } - resizeenzymeTable(); - updateInspectors(1000); -} - -function closeInspector(enzyme) -{ - var index = inspectedenzymes.indexOf(enzyme); - if (index < 0) { - return; - } - - inspectedenzymes.splice(index, 1); - resizeenzymeTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedenzymes, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectenzyme(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectenzyme(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeenzymes(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (enzymes.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzymes); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "enzyme-table-data") - .style("cursor", "pointer") - .on("click", inspectenzyme) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.KIT]; }) - .enter() - .append("td") - .append("div") - .attr("class", "enzyme-table-data-cell") - .text(String) - -} - -function enzymeFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, enzymeNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (enzymeNameFilterText == undefined) - { - enzymeNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedenzymes = enzymes.filter(enzymeFilter.curry(ownerFilterText, "OWNER")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(enzymeNameFilterText, "ENZYME_NAME")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(backboneFilterText, "BACKBONE")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzymes); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedenzymes) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "ENZYME" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#enzymeName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-body-style.css deleted file mode 100644 index 45d44aa3c478a9518da19bf69dc196478df40633..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-body-style.css +++ /dev/null @@ -1,131 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E5FFCC; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color:#B2B2B2;; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.protocol-table-data-cell { - overflow: hidden; - -} - - -#protocol-table tr:nth-child(odd) td{ - background-color:#E5FFCC; -} - - -#protocol-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#protocol-table tr.protocol-table-data:hover { - font-weight: bold; - -} - -#protocol-table td{ - -padding:5px; -} - -#protocol-table tr.protocol-table-header { - font-size:18px; - font-weight: bold; - color:black; - background-color: #CCFFCC; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-browser.html deleted file mode 100644 index 0c4e147b4a3481d6f3e525beda041d5fce01eed5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/general_protocol-browser.html +++ /dev/null @@ -1,1049 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Genereal Protocol Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="general_protocol-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> GENERAL PROTOCOLS </div> - <div id ="sectionsContainer"><div> - - - -<!-- - <div id="filter-button" style="padding-left:400px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Antibody Name</td><td> <input style="width: 200px" id="antibodyName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px; height: 500px; top: 100px; overflow: auto"> - <table id="protocol-table" style="float: left"> - <tr class="protocol-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Protocol Type</th><th>Publication</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All protocol -var protocols = null; - -/// The protocol that are currently being inspected -var inspectedprotocols = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - var protocolValue = sample.properties.GENERAL_PROTOCOL; - sample.properties.GENERAL_PROTOCOL_PARENTS = []; - - if (!xmlValueRegex.test(protocolValue)) - return; - - globalValue =protocolValue; - var protocolXml = xmlParser.parseFromString(protocolValue, "text/xml"); - - - for (i=1; i < protocolXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = protocolXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("quantity") != null) { - var quantity = sampleNode.attributes.getNamedItem("quantity").value; - } - else{ - var quantity = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var GENERAL_PROTOCOL_PARENTS = null; - - - GENERAL_PROTOCOL_PARENTS = "\n\n " +code + "(" + name + ")" + quantity ; - - - - sample.properties.GENERAL_PROTOCOL_PARENTS.push(GENERAL_PROTOCOL_PARENTS); - - - } - - -} - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION", "DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS", "GENERAL_PROTOCOL_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - protocol = objectOrId; - } else { - protocol = protocolsById[objectOrId]; - } - - return protocol; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the protocols variable */ -function initializeprotocols(result) -{ - // Construct a map of all protocols by id - protocolsById = {}; - - // Split the protocols into two groups, the ones that start with FRP in their sample name and the other ones. - var frpprotocols = [], otherprotocols = []; - var frpRegex = /^FRPROT[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - protocolsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the protocolsById map - theSample = protocolsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpprotocols.push(theSample); - } else { - otherprotocols.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherprotocols.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpprotocols.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of protocols - protocols = frpprotocols.concat(otherprotocols); -} - - - - -/** Set the size of the protocol-table based on whether or not inspectors are visible */ -function resizeprotocolTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var protocolTableTransition = d3.selectAll('div.protocol-table-data-cell'); - protocolTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectprotocol(protocol) -{ - if (inspectedprotocols.indexOf(protocol) < 0) { - inspectedprotocols.push(protocol); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var protocolToSend = $.extend({}, protocol); - delete protocolToSend.parents; - delete protocolToSend.children; - - } - resizeprotocolTable(); - updateInspectors(1000); -} - -function closeInspector(protocol) -{ - var index = inspectedprotocols.indexOf(protocol); - if (index < 0) { - return; - } - - inspectedprotocols.splice(index, 1); - resizeprotocolTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedprotocols, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectprotocol(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectprotocol(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeprotocols(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (protocols.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#protocol-table").selectAll("tr.protocol-table-data").data(protocols); - // Code under enter is run if there is no HTML element for a data element - - - - selection - .enter() - .append("tr") - .attr("class", "protocol-table-data") - .style("cursor", "pointer") - .on("click", inspectprotocol) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.PROTOCOL_TYPE, sample.properties.PUBLICATION]; }) - .enter() - .append("td") - .append("div") - .attr("class", "protocol-table-data-cell") - .text(String) - -} - -function protocolFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#protocol-table").selectAll("tr.protocol-table-data").data(protocols); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedprotocols) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "GENERAL_PROTOCOL" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png deleted file mode 100644 index 87ae5e81899908f3968ea230205322dc19ff4ee5..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.svg b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.svg deleted file mode 100644 index 70ac6c77f2774a5a5e8f6875e3c8ae1acb8e952a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/index.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/index.html deleted file mode 100644 index c4354285a057bcb690a8c36ad5e7be58136dd2b2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/index.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta HTTP-EQUIV="REFRESH" content="0; url=search-browser.html"> -</head> -<body> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/infra.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/infra.js deleted file mode 100644 index c292b17ec147d3eeddc2f649802a0b0d64f18148..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/infra.js +++ /dev/null @@ -1,70 +0,0 @@ -if (!Array.prototype.filter) -{ - Array.prototype.filter = function(fun /*, thisp*/) - { - var len = this.length; - if (typeof fun != "function") - throw new TypeError(); - - var res = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) - { - if (i in this) - { - var val = this[i]; // in case fun mutates this - if (fun.call(thisp, val, i, this)) - res.push(val); - } - } - - return res; - }; -} - -if (!Array.prototype.search) -{ - Array.prototype.search = function(fun /*, thisp*/) - { - var len2 = this.length; - if (typeof fun != "function") - throw new TypeError(); - - var res2 = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len2; i++) - { - if (i in this) - { - var val2 = this[i]; // in case fun mutates this - if (fun.call(thisp, val2, i, this)) - res2.push(val2); - } - } - - return res2; - }; -} - -if (!Function.prototype.curry) -{ - (function () - { - var slice = Array.prototype.slice; - Function.prototype.curry = function () - { - var target = this; - var args = slice.call(arguments); - return function () - { - var allArgs = args; - if (arguments.length > 0) - { - allArgs = args.concat(slice.call(arguments)); - } - return target.apply(this, allArgs); - }; - }; - }()) -}; - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.dataTables.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.dataTables.js deleted file mode 100644 index ae5d1750d90c90f197ff742d72c3ce5da3efa0b0..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.dataTables.js +++ /dev/null @@ -1,11863 +0,0 @@ -/** - * @summary DataTables - * @description Paginate, search and sort HTML tables - * @version 1.9.2 - * @file jquery.dataTables.js - * @author Allan Jardine (www.sprymedia.co.uk) - * @contact www.sprymedia.co.uk/contact - * - * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved. - * - * This source file is free software, under either the GPL v2 license or a - * BSD style license, available at: - * http://datatables.net/license_gpl2 - * http://datatables.net/license_bsd - * - * This source file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - * - * For details please refer to: http://www.datatables.net - */ - -/*jslint evil: true, undef: true, browser: true */ -/*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros*/ - -(/** @lends <global> */function($, window, document, undefined) { - /** - * DataTables is a plug-in for the jQuery Javascript library. It is a - * highly flexible tool, based upon the foundations of progressive - * enhancement, which will add advanced interaction controls to any - * HTML table. For a full list of features please refer to - * <a href="http://datatables.net">DataTables.net</a>. - * - * Note that the <i>DataTable</i> object is not a global variable but is - * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which - * it may be accessed. - * - * @class - * @param {object} [oInit={}] Configuration object for DataTables. Options - * are defined by {@link DataTable.defaults} - * @requires jQuery 1.3+ - * - * @example - * // Basic initialisation - * $(document).ready( function { - * $('#example').dataTable(); - * } ); - * - * @example - * // Initialisation with configuration options - in this case, disable - * // pagination and sorting. - * $(document).ready( function { - * $('#example').dataTable( { - * "bPaginate": false, - * "bSort": false - * } ); - * } ); - */ - var DataTable = function( oInit ) - { - - - /** - * Add a column to the list used for the table with default values - * @param {object} oSettings dataTables settings object - * @param {node} nTh The th element for this column - * @memberof DataTable#oApi - */ - function _fnAddColumn( oSettings, nTh ) - { - var oDefaults = DataTable.defaults.columns; - var iCol = oSettings.aoColumns.length; - var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { - "sSortingClass": oSettings.oClasses.sSortable, - "sSortingClassJUI": oSettings.oClasses.sSortJUI, - "nTh": nTh ? nTh : document.createElement('th'), - "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', - "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], - "mDataProp": oDefaults.mDataProp ? oDefaults.oDefaults : iCol - } ); - oSettings.aoColumns.push( oCol ); - - /* Add a column specific filter */ - if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) - { - oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); - } - else - { - var oPre = oSettings.aoPreSearchCols[ iCol ]; - - /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ - if ( oPre.bRegex === undefined ) - { - oPre.bRegex = true; - } - - if ( oPre.bSmart === undefined ) - { - oPre.bSmart = true; - } - - if ( oPre.bCaseInsensitive === undefined ) - { - oPre.bCaseInsensitive = true; - } - } - - /* Use the column options function to initialise classes etc */ - _fnColumnOptions( oSettings, iCol, null ); - } - - - /** - * Apply options for a column - * @param {object} oSettings dataTables settings object - * @param {int} iCol column index to consider - * @param {object} oOptions object with sType, bVisible and bSearchable - * @memberof DataTable#oApi - */ - function _fnColumnOptions( oSettings, iCol, oOptions ) - { - var oCol = oSettings.aoColumns[ iCol ]; - - /* User specified column options */ - if ( oOptions !== undefined && oOptions !== null ) - { - if ( oOptions.sType !== undefined ) - { - oCol.sType = oOptions.sType; - oCol._bAutoType = false; - } - - $.extend( oCol, oOptions ); - _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); - - /* iDataSort to be applied (backwards compatibility), but aDataSort will take - * priority if defined - */ - if ( oOptions.iDataSort !== undefined ) - { - oCol.aDataSort = [ oOptions.iDataSort ]; - } - _fnMap( oCol, oOptions, "aDataSort" ); - } - - /* Cache the data get and set functions for speed */ - oCol.fnGetData = _fnGetObjectDataFn( oCol.mDataProp ); - oCol.fnSetData = _fnSetObjectDataFn( oCol.mDataProp ); - - /* Feature sorting overrides column specific when off */ - if ( !oSettings.oFeatures.bSort ) - { - oCol.bSortable = false; - } - - /* Check that the class assignment is correct for sorting */ - if ( !oCol.bSortable || - ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableNone; - oCol.sSortingClassJUI = ""; - } - else if ( oCol.bSortable || - ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) - { - oCol.sSortingClass = oSettings.oClasses.sSortable; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; - } - else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableAsc; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; - } - else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableDesc; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; - } - } - - - /** - * Adjust the table column widths for new data. Note: you would probably want to - * do a redraw after calling this function! - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAdjustColumnSizing ( oSettings ) - { - /* Not interested in doing column width calculation if autowidth is disabled */ - if ( oSettings.oFeatures.bAutoWidth === false ) - { - return false; - } - - _fnCalculateColumnWidths( oSettings ); - for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth; - } - } - - - /** - * Covert the index of a visible column to the index in the data array (take account - * of hidden columns) - * @param {object} oSettings dataTables settings object - * @param {int} iMatch Visible column index to lookup - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnVisibleToColumnIndex( oSettings, iMatch ) - { - var iColumn = -1; - - for ( var i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === true ) - { - iColumn++; - } - - if ( iColumn == iMatch ) - { - return i; - } - } - - return null; - } - - - /** - * Covert the index of an index in the data array and convert it to the visible - * column index (take account of hidden columns) - * @param {int} iMatch Column index to lookup - * @param {object} oSettings dataTables settings object - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnColumnIndexToVisible( oSettings, iMatch ) - { - var iVisible = -1; - for ( var i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === true ) - { - iVisible++; - } - - if ( i == iMatch ) - { - return oSettings.aoColumns[i].bVisible === true ? iVisible : null; - } - } - - return null; - } - - - /** - * Get the number of visible columns - * @returns {int} i the number of visible columns - * @param {object} oS dataTables settings object - * @memberof DataTable#oApi - */ - function _fnVisbleColumns( oS ) - { - var iVis = 0; - for ( var i=0 ; i<oS.aoColumns.length ; i++ ) - { - if ( oS.aoColumns[i].bVisible === true ) - { - iVis++; - } - } - return iVis; - } - - - /** - * Get the sort type based on an input string - * @param {string} sData data we wish to know the type of - * @returns {string} type (defaults to 'string' if no type can be detected) - * @memberof DataTable#oApi - */ - function _fnDetectType( sData ) - { - var aTypes = DataTable.ext.aTypes; - var iLen = aTypes.length; - - for ( var i=0 ; i<iLen ; i++ ) - { - var sType = aTypes[i]( sData ); - if ( sType !== null ) - { - return sType; - } - } - - return 'string'; - } - - - /** - * Figure out how to reorder a display list - * @param {object} oSettings dataTables settings object - * @returns array {int} aiReturn index list for reordering - * @memberof DataTable#oApi - */ - function _fnReOrderIndex ( oSettings, sColumns ) - { - var aColumns = sColumns.split(','); - var aiReturn = []; - - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - for ( var j=0 ; j<iLen ; j++ ) - { - if ( oSettings.aoColumns[i].sName == aColumns[j] ) - { - aiReturn.push( j ); - break; - } - } - } - - return aiReturn; - } - - - /** - * Get the column ordering that DataTables expects - * @param {object} oSettings dataTables settings object - * @returns {string} comma separated list of names - * @memberof DataTable#oApi - */ - function _fnColumnOrdering ( oSettings ) - { - var sNames = ''; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - sNames += oSettings.aoColumns[i].sName+','; - } - if ( sNames.length == iLen ) - { - return ""; - } - return sNames.slice(0, -1); - } - - - /** - * Take the column definitions and static columns arrays and calculate how - * they relate to column indexes. The callback function will then apply the - * definition found for a column to a suitable configuration object. - * @param {object} oSettings dataTables settings object - * @param {array} aoColDefs The aoColumnDefs array that is to be applied - * @param {array} aoCols The aoColumns array that defines columns individually - * @param {function} fn Callback function - takes two parameters, the calculated - * column index and the definition for that column. - * @memberof DataTable#oApi - */ - function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn ) - { - var i, iLen, j, jLen, k, kLen; - - // Column definitions with aTargets - if ( aoColDefs ) - { - /* Loop over the definitions array - loop in reverse so first instance has priority */ - for ( i=aoColDefs.length-1 ; i>=0 ; i-- ) - { - /* Each definition can target multiple columns, as it is an array */ - var aTargets = aoColDefs[i].aTargets; - if ( !$.isArray( aTargets ) ) - { - _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) ); - } - - for ( j=0, jLen=aTargets.length ; j<jLen ; j++ ) - { - if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 ) - { - /* Add columns that we don't yet know about */ - while( oSettings.aoColumns.length <= aTargets[j] ) - { - _fnAddColumn( oSettings ); - } - - /* Integer, basic index */ - fn( aTargets[j], aoColDefs[i] ); - } - else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 ) - { - /* Negative integer, right to left column counting */ - fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] ); - } - else if ( typeof aTargets[j] === 'string' ) - { - /* Class name matching on TH element */ - for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ ) - { - if ( aTargets[j] == "_all" || - $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) ) - { - fn( k, aoColDefs[i] ); - } - } - } - } - } - } - - // Statically defined columns array - if ( aoCols ) - { - for ( i=0, iLen=aoCols.length ; i<iLen ; i++ ) - { - fn( i, aoCols[i] ); - } - } - } - - - - /** - * Add a data array to the table, creating DOM node etc. This is the parallel to - * _fnGatherData, but for adding rows from a Javascript source, rather than a - * DOM source. - * @param {object} oSettings dataTables settings object - * @param {array} aData data array to be added - * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed - * @memberof DataTable#oApi - */ - function _fnAddData ( oSettings, aDataSupplied ) - { - var oCol; - - /* Take an independent copy of the data source so we can bash it about as we wish */ - var aDataIn = ($.isArray(aDataSupplied)) ? - aDataSupplied.slice() : - $.extend( true, {}, aDataSupplied ); - - /* Create the object for storing information about this new row */ - var iRow = oSettings.aoData.length; - var oData = $.extend( true, {}, DataTable.models.oRow ); - oData._aData = aDataIn; - oSettings.aoData.push( oData ); - - /* Create the cells */ - var nTd, sThisType; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oCol = oSettings.aoColumns[i]; - - /* Use rendered data for filtering/sorting */ - if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mDataProp !== null ) - { - _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) ); - } - else - { - _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) ); - } - - /* See if we should auto-detect the column type */ - if ( oCol._bAutoType && oCol.sType != 'string' ) - { - /* Attempt to auto detect the type - same as _fnGatherData() */ - var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' ); - if ( sVarType !== null && sVarType !== '' ) - { - sThisType = _fnDetectType( sVarType ); - if ( oCol.sType === null ) - { - oCol.sType = sThisType; - } - else if ( oCol.sType != sThisType && oCol.sType != "html" ) - { - /* String is always the 'fallback' option */ - oCol.sType = 'string'; - } - } - } - } - - /* Add to the display array */ - oSettings.aiDisplayMaster.push( iRow ); - - /* Create the DOM imformation */ - if ( !oSettings.oFeatures.bDeferRender ) - { - _fnCreateTr( oSettings, iRow ); - } - - return iRow; - } - - - /** - * Read in the data from the target table from the DOM - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnGatherData( oSettings ) - { - var iLoop, i, iLen, j, jLen, jInner, - nTds, nTrs, nTd, aLocalData, iThisIndex, - iRow, iRows, iColumn, iColumns, sNodeName, - oCol, oData; - - /* - * Process by row first - * Add the data object for the whole table - storing the tr node. Note - no point in getting - * DOM based data if we are going to go and replace it with Ajax source data. - */ - if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null ) - { - nTrs = oSettings.nTBody.childNodes; - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - if ( nTrs[i].nodeName.toUpperCase() == "TR" ) - { - iThisIndex = oSettings.aoData.length; - nTrs[i]._DT_RowIndex = iThisIndex; - oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, { - "nTr": nTrs[i] - } ) ); - - oSettings.aiDisplayMaster.push( iThisIndex ); - nTds = nTrs[i].childNodes; - jInner = 0; - - for ( j=0, jLen=nTds.length ; j<jLen ; j++ ) - { - sNodeName = nTds[j].nodeName.toUpperCase(); - if ( sNodeName == "TD" || sNodeName == "TH" ) - { - _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTds[j].innerHTML) ); - jInner++; - } - } - } - } - } - - /* Gather in the TD elements of the Table - note that this is basically the same as - * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet - * setup! - */ - nTrs = _fnGetTrNodes( oSettings ); - nTds = []; - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ ) - { - nTd = nTrs[i].childNodes[j]; - sNodeName = nTd.nodeName.toUpperCase(); - if ( sNodeName == "TD" || sNodeName == "TH" ) - { - nTds.push( nTd ); - } - } - } - - /* Now process by column */ - for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ ) - { - oCol = oSettings.aoColumns[iColumn]; - - /* Get the title of the column - unless there is a user set one */ - if ( oCol.sTitle === null ) - { - oCol.sTitle = oCol.nTh.innerHTML; - } - - var - bAutoType = oCol._bAutoType, - bRender = typeof oCol.fnRender === 'function', - bClass = oCol.sClass !== null, - bVisible = oCol.bVisible, - nCell, sThisType, sRendered, sValType; - - /* A single loop to rule them all (and be more efficient) */ - if ( bAutoType || bRender || bClass || !bVisible ) - { - for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ ) - { - oData = oSettings.aoData[iRow]; - nCell = nTds[ (iRow*iColumns) + iColumn ]; - - /* Type detection */ - if ( bAutoType && oCol.sType != 'string' ) - { - sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' ); - if ( sValType !== '' ) - { - sThisType = _fnDetectType( sValType ); - if ( oCol.sType === null ) - { - oCol.sType = sThisType; - } - else if ( oCol.sType != sThisType && - oCol.sType != "html" ) - { - /* String is always the 'fallback' option */ - oCol.sType = 'string'; - } - } - } - - if ( typeof oCol.mDataProp === 'function' ) - { - nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' ); - } - - /* Rendering */ - if ( bRender ) - { - sRendered = _fnRender( oSettings, iRow, iColumn ); - nCell.innerHTML = sRendered; - if ( oCol.bUseRendered ) - { - /* Use the rendered data for filtering/sorting */ - _fnSetCellData( oSettings, iRow, iColumn, sRendered ); - } - } - - /* Classes */ - if ( bClass ) - { - nCell.className += ' '+oCol.sClass; - } - - /* Column visability */ - if ( !bVisible ) - { - oData._anHidden[iColumn] = nCell; - nCell.parentNode.removeChild( nCell ); - } - else - { - oData._anHidden[iColumn] = null; - } - - if ( oCol.fnCreatedCell ) - { - oCol.fnCreatedCell.call( oSettings.oInstance, - nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn - ); - } - } - } - } - - /* Row created callbacks */ - if ( oSettings.aoRowCreatedCallback.length !== 0 ) - { - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - oData = oSettings.aoData[i]; - _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] ); - } - } - } - - - /** - * Take a TR element and convert it to an index in aoData - * @param {object} oSettings dataTables settings object - * @param {node} n the TR element to find - * @returns {int} index if the node is found, null if not - * @memberof DataTable#oApi - */ - function _fnNodeToDataIndex( oSettings, n ) - { - return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null; - } - - - /** - * Take a TD element and convert it into a column data index (not the visible index) - * @param {object} oSettings dataTables settings object - * @param {int} iRow The row number the TD/TH can be found in - * @param {node} n The TD/TH element to find - * @returns {int} index if the node is found, -1 if not - * @memberof DataTable#oApi - */ - function _fnNodeToColumnIndex( oSettings, iRow, n ) - { - var anCells = _fnGetTdNodes( oSettings, iRow ); - - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( anCells[i] === n ) - { - return i; - } - } - return -1; - } - - - /** - * Get an array of data for a given row from the internal data cache - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {string} sSpecific data get type ('type' 'filter' 'sort') - * @returns {array} Data array - * @memberof DataTable#oApi - */ - function _fnGetRowData( oSettings, iRow, sSpecific ) - { - var out = []; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - out.push( _fnGetCellData( oSettings, iRow, i, sSpecific ) ); - } - return out; - } - - - /** - * Get the data for a given cell from the internal cache, taking into account data mapping - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {int} iCol Column index - * @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort') - * @returns {*} Cell data - * @memberof DataTable#oApi - */ - function _fnGetCellData( oSettings, iRow, iCol, sSpecific ) - { - var sData; - var oCol = oSettings.aoColumns[iCol]; - var oData = oSettings.aoData[iRow]._aData; - - if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined ) - { - if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null ) - { - _fnLog( oSettings, 0, "Requested unknown parameter "+ - (typeof oCol.mDataProp=='function' ? '{mDataprop function}' : "'"+oCol.mDataProp+"'")+ - " from the data source for row "+iRow ); - oSettings.iDrawError = oSettings.iDraw; - } - return oCol.sDefaultContent; - } - - /* When the data source is null, we can use default column data */ - if ( sData === null && oCol.sDefaultContent !== null ) - { - sData = oCol.sDefaultContent; - } - else if ( typeof sData === 'function' ) - { - /* If the data source is a function, then we run it and use the return */ - return sData(); - } - - if ( sSpecific == 'display' && sData === null ) - { - return ''; - } - return sData; - } - - - /** - * Set the value for a specific cell, into the internal data cache - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {int} iCol Column index - * @param {*} val Value to set - * @memberof DataTable#oApi - */ - function _fnSetCellData( oSettings, iRow, iCol, val ) - { - var oCol = oSettings.aoColumns[iCol]; - var oData = oSettings.aoData[iRow]._aData; - - oCol.fnSetData( oData, val ); - } - - - /** - * Return a function that can be used to get data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data get function - * @memberof DataTable#oApi - */ - function _fnGetObjectDataFn( mSource ) - { - if ( mSource === null ) - { - /* Give an empty string for rendering / sorting etc */ - return function (data, type) { - return null; - }; - } - else if ( typeof mSource === 'function' ) - { - return function (data, type) { - return mSource( data, type ); - }; - } - else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 ) - { - /* If there is a . in the source string then the data source is in a - * nested object so we loop over the data for each level to get the next - * level down. On each loop we test for undefined, and if found immediatly - * return. This allows entire objects to be missing and sDefaultContent to - * be used if defined, rather than throwing an error - */ - var a = mSource.split('.'); - return function (data, type) { - for ( var i=0, iLen=a.length ; i<iLen ; i++ ) - { - data = data[ a[i] ]; - if ( data === undefined ) - { - return undefined; - } - } - return data; - }; - } - else - { - /* Array or flat object mapping */ - return function (data, type) { - return data[mSource]; - }; - } - } - - - /** - * Return a function that can be used to set data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data set function - * @memberof DataTable#oApi - */ - function _fnSetObjectDataFn( mSource ) - { - if ( mSource === null ) - { - /* Nothing to do when the data source is null */ - return function (data, val) {}; - } - else if ( typeof mSource === 'function' ) - { - return function (data, val) { - mSource( data, 'set', val ); - }; - } - else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 ) - { - /* Like the get, we need to get data from a nested object. */ - var a = mSource.split('.'); - return function (data, val) { - for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) - { - // If the nested object doesn't currently exist - since we are - // trying to set the value - create it - if ( data[ a[i] ] === undefined ) - { - data[ a[i] ] = {}; - } - data = data[ a[i] ]; - } - data[ a[a.length-1] ] = val; - }; - } - else - { - /* Array or flat object mapping */ - return function (data, val) { - data[mSource] = val; - }; - } - } - - - /** - * Return an array with the full table data - * @param {object} oSettings dataTables settings object - * @returns array {array} aData Master data array - * @memberof DataTable#oApi - */ - function _fnGetDataMaster ( oSettings ) - { - var aData = []; - var iLen = oSettings.aoData.length; - for ( var i=0 ; i<iLen; i++ ) - { - aData.push( oSettings.aoData[i]._aData ); - } - return aData; - } - - - /** - * Nuke the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnClearTable( oSettings ) - { - oSettings.aoData.splice( 0, oSettings.aoData.length ); - oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length ); - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length ); - _fnCalculateEnd( oSettings ); - } - - - /** - * Take an array of integers (index array) and remove a target integer (value - not - * the key!) - * @param {array} a Index array to target - * @param {int} iTarget value to find - * @memberof DataTable#oApi - */ - function _fnDeleteIndex( a, iTarget ) - { - var iTargetIndex = -1; - - for ( var i=0, iLen=a.length ; i<iLen ; i++ ) - { - if ( a[i] == iTarget ) - { - iTargetIndex = i; - } - else if ( a[i] > iTarget ) - { - a[i]--; - } - } - - if ( iTargetIndex != -1 ) - { - a.splice( iTargetIndex, 1 ); - } - } - - - /** - * Call the developer defined fnRender function for a given cell (row/column) with - * the required parameters and return the result. - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData index for the row - * @param {int} iCol aoColumns index for the column - * @returns {*} Return of the developer's fnRender function - * @memberof DataTable#oApi - */ - function _fnRender( oSettings, iRow, iCol ) - { - var oCol = oSettings.aoColumns[iCol]; - - return oCol.fnRender( { - "iDataRow": iRow, - "iDataColumn": iCol, - "oSettings": oSettings, - "aData": oSettings.aoData[iRow]._aData, - "mDataProp": oCol.mDataProp - }, _fnGetCellData(oSettings, iRow, iCol, 'display') ); - } - - /** - * Create a new TR element (and it's TD children) for a row - * @param {object} oSettings dataTables settings object - * @param {int} iRow Row to consider - * @memberof DataTable#oApi - */ - function _fnCreateTr ( oSettings, iRow ) - { - var oData = oSettings.aoData[iRow]; - var nTd; - - if ( oData.nTr === null ) - { - oData.nTr = document.createElement('tr'); - - /* Use a private property on the node to allow reserve mapping from the node - * to the aoData array for fast look up - */ - oData.nTr._DT_RowIndex = iRow; - - /* Special parameters can be given by the data source to be used on the row */ - if ( oData._aData.DT_RowId ) - { - oData.nTr.id = oData._aData.DT_RowId; - } - - if ( oData._aData.DT_RowClass ) - { - $(oData.nTr).addClass( oData._aData.DT_RowClass ); - } - - /* Process each column */ - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - var oCol = oSettings.aoColumns[i]; - nTd = document.createElement( oCol.sCellType ); - - /* Render if needed - if bUseRendered is true then we already have the rendered - * value in the data source - so can just use that - */ - nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null)) ? - _fnRender( oSettings, iRow, i ) : - _fnGetCellData( oSettings, iRow, i, 'display' ); - - /* Add user defined class */ - if ( oCol.sClass !== null ) - { - nTd.className = oCol.sClass; - } - - if ( oCol.bVisible ) - { - oData.nTr.appendChild( nTd ); - oData._anHidden[i] = null; - } - else - { - oData._anHidden[i] = nTd; - } - - if ( oCol.fnCreatedCell ) - { - oCol.fnCreatedCell.call( oSettings.oInstance, - nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i - ); - } - } - - _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] ); - } - } - - - /** - * Create the HTML header for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnBuildHead( oSettings ) - { - var i, nTh, iLen, j, jLen; - var iThs = oSettings.nTHead.getElementsByTagName('th').length; - var iCorrector = 0; - var jqChildren; - - /* If there is a header in place - then use it - otherwise it's going to get nuked... */ - if ( iThs !== 0 ) - { - /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */ - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - nTh.setAttribute('role', 'columnheader'); - if ( oSettings.aoColumns[i].bSortable ) - { - nTh.setAttribute('tabindex', oSettings.iTabIndex); - nTh.setAttribute('aria-controls', oSettings.sTableId); - } - - if ( oSettings.aoColumns[i].sClass !== null ) - { - $(nTh).addClass( oSettings.aoColumns[i].sClass ); - } - - /* Set the title of the column if it is user defined (not what was auto detected) */ - if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML ) - { - nTh.innerHTML = oSettings.aoColumns[i].sTitle; - } - } - } - else - { - /* We don't have a header in the DOM - so we are going to have to create one */ - var nTr = document.createElement( "tr" ); - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - nTh.innerHTML = oSettings.aoColumns[i].sTitle; - nTh.setAttribute('tabindex', '0'); - - if ( oSettings.aoColumns[i].sClass !== null ) - { - $(nTh).addClass( oSettings.aoColumns[i].sClass ); - } - - nTr.appendChild( nTh ); - } - $(oSettings.nTHead).html( '' )[0].appendChild( nTr ); - _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead ); - } - - /* ARIA role for the rows */ - $(oSettings.nTHead).children('tr').attr('role', 'row'); - - /* Add the extra markup needed by jQuery UI's themes */ - if ( oSettings.bJUI ) - { - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - - var nDiv = document.createElement('div'); - nDiv.className = oSettings.oClasses.sSortJUIWrapper; - $(nTh).contents().appendTo(nDiv); - - var nSpan = document.createElement('span'); - nSpan.className = oSettings.oClasses.sSortIcon; - nDiv.appendChild( nSpan ); - nTh.appendChild( nDiv ); - } - } - - if ( oSettings.oFeatures.bSort ) - { - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable !== false ) - { - _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i ); - } - else - { - $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone ); - } - } - } - - /* Deal with the footer - add classes if required */ - if ( oSettings.oClasses.sFooterTH !== "" ) - { - $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH ); - } - - /* Cache the footer elements */ - if ( oSettings.nTFoot !== null ) - { - var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter ); - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( anCells[i] ) - { - oSettings.aoColumns[i].nTf = anCells[i]; - if ( oSettings.aoColumns[i].sClass ) - { - $(anCells[i]).addClass( oSettings.aoColumns[i].sClass ); - } - } - } - } - } - - - /** - * Draw the header (or footer) element based on the column visibility states. The - * methodology here is to use the layout array from _fnDetectHeader, modified for - * the instantaneous column visibility, to construct the new layout. The grid is - * traversed over cell at a time in a rows x columns grid fashion, although each - * cell insert can cover multiple elements in the grid - which is tracks using the - * aApplied array. Cell inserts in the grid will only occur where there isn't - * already a cell in that position. - * @param {object} oSettings dataTables settings object - * @param array {objects} aoSource Layout array from _fnDetectHeader - * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, - * @memberof DataTable#oApi - */ - function _fnDrawHead( oSettings, aoSource, bIncludeHidden ) - { - var i, iLen, j, jLen, k, kLen, n, nLocalTr; - var aoLocal = []; - var aApplied = []; - var iColumns = oSettings.aoColumns.length; - var iRowspan, iColspan; - - if ( bIncludeHidden === undefined ) - { - bIncludeHidden = false; - } - - /* Make a copy of the master layout array, but without the visible columns in it */ - for ( i=0, iLen=aoSource.length ; i<iLen ; i++ ) - { - aoLocal[i] = aoSource[i].slice(); - aoLocal[i].nTr = aoSource[i].nTr; - - /* Remove any columns which are currently hidden */ - for ( j=iColumns-1 ; j>=0 ; j-- ) - { - if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden ) - { - aoLocal[i].splice( j, 1 ); - } - } - - /* Prep the applied array - it needs an element for each row */ - aApplied.push( [] ); - } - - for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ ) - { - nLocalTr = aoLocal[i].nTr; - - /* All cells are going to be replaced, so empty out the row */ - if ( nLocalTr ) - { - while( (n = nLocalTr.firstChild) ) - { - nLocalTr.removeChild( n ); - } - } - - for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ ) - { - iRowspan = 1; - iColspan = 1; - - /* Check to see if there is already a cell (row/colspan) covering our target - * insert point. If there is, then there is nothing to do. - */ - if ( aApplied[i][j] === undefined ) - { - nLocalTr.appendChild( aoLocal[i][j].cell ); - aApplied[i][j] = 1; - - /* Expand the cell to cover as many rows as needed */ - while ( aoLocal[i+iRowspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell ) - { - aApplied[i+iRowspan][j] = 1; - iRowspan++; - } - - /* Expand the cell to cover as many columns as needed */ - while ( aoLocal[i][j+iColspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell ) - { - /* Must update the applied array over the rows for the columns */ - for ( k=0 ; k<iRowspan ; k++ ) - { - aApplied[i+k][j+iColspan] = 1; - } - iColspan++; - } - - /* Do the actual expansion in the DOM */ - aoLocal[i][j].cell.rowSpan = iRowspan; - aoLocal[i][j].cell.colSpan = iColspan; - } - } - } - } - - - /** - * Insert the required TR nodes into the table for display - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnDraw( oSettings ) - { - /* Provide a pre-callback function which can be used to cancel the draw is false is returned */ - var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] ); - if ( $.inArray( false, aPreDraw ) !== -1 ) - { - _fnProcessingDisplay( oSettings, false ); - return; - } - - var i, iLen, n; - var anRows = []; - var iRowCount = 0; - var iStripes = oSettings.asStripeClasses.length; - var iOpenRows = oSettings.aoOpenRows.length; - - oSettings.bDrawing = true; - - /* Check and see if we have an initial draw position from state saving */ - if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 ) - { - if ( oSettings.oFeatures.bServerSide ) - { - oSettings._iDisplayStart = oSettings.iInitDisplayStart; - } - else - { - oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ? - 0 : oSettings.iInitDisplayStart; - } - oSettings.iInitDisplayStart = -1; - _fnCalculateEnd( oSettings ); - } - - /* Server-side processing draw intercept */ - if ( oSettings.bDeferLoading ) - { - oSettings.bDeferLoading = false; - oSettings.iDraw++; - } - else if ( !oSettings.oFeatures.bServerSide ) - { - oSettings.iDraw++; - } - else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) ) - { - return; - } - - if ( oSettings.aiDisplay.length !== 0 ) - { - var iStart = oSettings._iDisplayStart; - var iEnd = oSettings._iDisplayEnd; - - if ( oSettings.oFeatures.bServerSide ) - { - iStart = 0; - iEnd = oSettings.aoData.length; - } - - for ( var j=iStart ; j<iEnd ; j++ ) - { - var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ]; - if ( aoData.nTr === null ) - { - _fnCreateTr( oSettings, oSettings.aiDisplay[j] ); - } - - var nRow = aoData.nTr; - - /* Remove the old striping classes and then add the new one */ - if ( iStripes !== 0 ) - { - var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ]; - if ( aoData._sRowStripe != sStripe ) - { - $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe ); - aoData._sRowStripe = sStripe; - } - } - - /* Row callback functions - might want to manipule the row */ - _fnCallbackFire( oSettings, 'aoRowCallback', null, - [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] ); - - anRows.push( nRow ); - iRowCount++; - - /* If there is an open row - and it is attached to this parent - attach it on redraw */ - if ( iOpenRows !== 0 ) - { - for ( var k=0 ; k<iOpenRows ; k++ ) - { - if ( nRow == oSettings.aoOpenRows[k].nParent ) - { - anRows.push( oSettings.aoOpenRows[k].nTr ); - break; - } - } - } - } - } - else - { - /* Table is empty - create a row with an empty message in it */ - anRows[ 0 ] = document.createElement( 'tr' ); - - if ( oSettings.asStripeClasses[0] ) - { - anRows[ 0 ].className = oSettings.asStripeClasses[0]; - } - - var oLang = oSettings.oLanguage; - var sZero = oLang.sZeroRecords; - if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide ) - { - sZero = oLang.sLoadingRecords; - } - else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 ) - { - sZero = oLang.sEmptyTable; - } - - var nTd = document.createElement( 'td' ); - nTd.setAttribute( 'valign', "top" ); - nTd.colSpan = _fnVisbleColumns( oSettings ); - nTd.className = oSettings.oClasses.sRowEmpty; - nTd.innerHTML = _fnInfoMacros( oSettings, sZero ); - - anRows[ iRowCount ].appendChild( nTd ); - } - - /* Header and footer callbacks */ - _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], - _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - - _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], - _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - - /* - * Need to remove any old row from the display - note we can't just empty the tbody using - * $().html('') since this will unbind the jQuery event handlers (even although the node - * still exists!) - equally we can't use innerHTML, since IE throws an exception. - */ - var - nAddFrag = document.createDocumentFragment(), - nRemoveFrag = document.createDocumentFragment(), - nBodyPar, nTrs; - - if ( oSettings.nTBody ) - { - nBodyPar = oSettings.nTBody.parentNode; - nRemoveFrag.appendChild( oSettings.nTBody ); - - /* When doing infinite scrolling, only remove child rows when sorting, filtering or start - * up. When not infinite scroll, always do it. - */ - if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete || - oSettings.bSorted || oSettings.bFiltered ) - { - while( (n = oSettings.nTBody.firstChild) ) - { - oSettings.nTBody.removeChild( n ); - } - } - - /* Put the draw table into the dom */ - for ( i=0, iLen=anRows.length ; i<iLen ; i++ ) - { - nAddFrag.appendChild( anRows[i] ); - } - - oSettings.nTBody.appendChild( nAddFrag ); - if ( nBodyPar !== null ) - { - nBodyPar.appendChild( oSettings.nTBody ); - } - } - - /* Call all required callback functions for the end of a draw */ - _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] ); - - /* Draw is complete, sorting and filtering must be as well */ - oSettings.bSorted = false; - oSettings.bFiltered = false; - oSettings.bDrawing = false; - - if ( oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - if ( !oSettings._bInitComplete ) - { - _fnInitComplete( oSettings ); - } - } - } - - - /** - * Redraw the table - taking account of the various features which are enabled - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnReDraw( oSettings ) - { - if ( oSettings.oFeatures.bSort ) - { - /* Sorting will refilter and draw for us */ - _fnSort( oSettings, oSettings.oPreviousSearch ); - } - else if ( oSettings.oFeatures.bFilter ) - { - /* Filtering will redraw for us */ - _fnFilterComplete( oSettings, oSettings.oPreviousSearch ); - } - else - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - - - /** - * Add the options to the page HTML for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAddOptionsHtml ( oSettings ) - { - /* - * Create a temporary, empty, div which we can later on replace with what we have generated - * we do it this way to rendering the 'options' html offline - speed :-) - */ - var nHolding = $('<div></div>')[0]; - oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); - - /* - * All DataTables are wrapped in a div - */ - oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0]; - oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; - - /* Track where we want to insert the option */ - var nInsertNode = oSettings.nTableWrapper; - - /* Loop over the user set positioning and place the elements as needed */ - var aDom = oSettings.sDom.split(''); - var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j; - for ( var i=0 ; i<aDom.length ; i++ ) - { - iPushFeature = 0; - cOption = aDom[i]; - - if ( cOption == '<' ) - { - /* New container div */ - nNewNode = $('<div></div>')[0]; - - /* Check to see if we should append an id and/or a class name to the container */ - cNext = aDom[i+1]; - if ( cNext == "'" || cNext == '"' ) - { - sAttr = ""; - j = 2; - while ( aDom[i+j] != cNext ) - { - sAttr += aDom[i+j]; - j++; - } - - /* Replace jQuery UI constants */ - if ( sAttr == "H" ) - { - sAttr = oSettings.oClasses.sJUIHeader; - } - else if ( sAttr == "F" ) - { - sAttr = oSettings.oClasses.sJUIFooter; - } - - /* The attribute can be in the format of "#id.class", "#id" or "class" This logic - * breaks the string into parts and applies them as needed - */ - if ( sAttr.indexOf('.') != -1 ) - { - var aSplit = sAttr.split('.'); - nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); - nNewNode.className = aSplit[1]; - } - else if ( sAttr.charAt(0) == "#" ) - { - nNewNode.id = sAttr.substr(1, sAttr.length-1); - } - else - { - nNewNode.className = sAttr; - } - - i += j; /* Move along the position array */ - } - - nInsertNode.appendChild( nNewNode ); - nInsertNode = nNewNode; - } - else if ( cOption == '>' ) - { - /* End container div */ - nInsertNode = nInsertNode.parentNode; - } - else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange ) - { - /* Length */ - nTmp = _fnFeatureHtmlLength( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'f' && oSettings.oFeatures.bFilter ) - { - /* Filter */ - nTmp = _fnFeatureHtmlFilter( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'r' && oSettings.oFeatures.bProcessing ) - { - /* pRocessing */ - nTmp = _fnFeatureHtmlProcessing( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 't' ) - { - /* Table */ - nTmp = _fnFeatureHtmlTable( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'i' && oSettings.oFeatures.bInfo ) - { - /* Info */ - nTmp = _fnFeatureHtmlInfo( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'p' && oSettings.oFeatures.bPaginate ) - { - /* Pagination */ - nTmp = _fnFeatureHtmlPaginate( oSettings ); - iPushFeature = 1; - } - else if ( DataTable.ext.aoFeatures.length !== 0 ) - { - /* Plug-in features */ - var aoFeatures = DataTable.ext.aoFeatures; - for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ ) - { - if ( cOption == aoFeatures[k].cFeature ) - { - nTmp = aoFeatures[k].fnInit( oSettings ); - if ( nTmp ) - { - iPushFeature = 1; - } - break; - } - } - } - - /* Add to the 2D features array */ - if ( iPushFeature == 1 && nTmp !== null ) - { - if ( typeof oSettings.aanFeatures[cOption] !== 'object' ) - { - oSettings.aanFeatures[cOption] = []; - } - oSettings.aanFeatures[cOption].push( nTmp ); - nInsertNode.appendChild( nTmp ); - } - } - - /* Built our DOM structure - replace the holding div with what we want */ - nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding ); - } - - - /** - * Use the DOM source to create up an array of header cells. The idea here is to - * create a layout grid (array) of rows x columns, which contains a reference - * to the cell that that point in the grid (regardless of col/rowspan), such that - * any column / row could be removed and the new grid constructed - * @param array {object} aLayout Array to store the calculated layout in - * @param {node} nThead The header/footer element for the table - * @memberof DataTable#oApi - */ - function _fnDetectHeader ( aLayout, nThead ) - { - var nTrs = $(nThead).children('tr'); - var nCell; - var i, j, k, l, iLen, jLen, iColShifted; - var fnShiftCol = function ( a, i, j ) { - while ( a[i][j] ) { - j++; - } - return j; - }; - - aLayout.splice( 0, aLayout.length ); - - /* We know how many rows there are in the layout - so prep it */ - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - aLayout.push( [] ); - } - - /* Calculate a layout array */ - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - var iColumn = 0; - - /* For every cell in the row... */ - for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ ) - { - nCell = nTrs[i].childNodes[j]; - - if ( nCell.nodeName.toUpperCase() == "TD" || - nCell.nodeName.toUpperCase() == "TH" ) - { - /* Get the col and rowspan attributes from the DOM and sanitise them */ - var iColspan = nCell.getAttribute('colspan') * 1; - var iRowspan = nCell.getAttribute('rowspan') * 1; - iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan; - iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan; - - /* There might be colspan cells already in this row, so shift our target - * accordingly - */ - iColShifted = fnShiftCol( aLayout, i, iColumn ); - - /* If there is col / rowspan, copy the information into the layout grid */ - for ( l=0 ; l<iColspan ; l++ ) - { - for ( k=0 ; k<iRowspan ; k++ ) - { - aLayout[i+k][iColShifted+l] = { - "cell": nCell, - "unique": iColspan == 1 ? true : false - }; - aLayout[i+k].nTr = nTrs[i]; - } - } - } - } - } - } - - - /** - * Get an array of unique th elements, one for each column - * @param {object} oSettings dataTables settings object - * @param {node} nHeader automatically detect the layout from this node - optional - * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional - * @returns array {node} aReturn list of unique ths - * @memberof DataTable#oApi - */ - function _fnGetUniqueThs ( oSettings, nHeader, aLayout ) - { - var aReturn = []; - if ( !aLayout ) - { - aLayout = oSettings.aoHeader; - if ( nHeader ) - { - aLayout = []; - _fnDetectHeader( aLayout, nHeader ); - } - } - - for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ ) - { - for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ ) - { - if ( aLayout[i][j].unique && - (!aReturn[j] || !oSettings.bSortCellsTop) ) - { - aReturn[j] = aLayout[i][j].cell; - } - } - } - - return aReturn; - } - - - - /** - * Update the table using an Ajax call - * @param {object} oSettings dataTables settings object - * @returns {boolean} Block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxUpdate( oSettings ) - { - if ( oSettings.bAjaxDataGet ) - { - oSettings.iDraw++; - _fnProcessingDisplay( oSettings, true ); - var iColumns = oSettings.aoColumns.length; - var aoData = _fnAjaxParameters( oSettings ); - _fnServerParams( oSettings, aoData ); - - oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, - function(json) { - _fnAjaxUpdateDraw( oSettings, json ); - }, oSettings ); - return false; - } - else - { - return true; - } - } - - - /** - * Build up the parameters in an object needed for a server-side processing request - * @param {object} oSettings dataTables settings object - * @returns {bool} block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxParameters( oSettings ) - { - var iColumns = oSettings.aoColumns.length; - var aoData = [], mDataProp, aaSort, aDataSort; - var i, j; - - aoData.push( { "name": "sEcho", "value": oSettings.iDraw } ); - aoData.push( { "name": "iColumns", "value": iColumns } ); - aoData.push( { "name": "sColumns", "value": _fnColumnOrdering(oSettings) } ); - aoData.push( { "name": "iDisplayStart", "value": oSettings._iDisplayStart } ); - aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ? - oSettings._iDisplayLength : -1 } ); - - for ( i=0 ; i<iColumns ; i++ ) - { - mDataProp = oSettings.aoColumns[i].mDataProp; - aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } ); - } - - /* Filtering */ - if ( oSettings.oFeatures.bFilter !== false ) - { - aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } ); - aoData.push( { "name": "bRegex", "value": oSettings.oPreviousSearch.bRegex } ); - for ( i=0 ; i<iColumns ; i++ ) - { - aoData.push( { "name": "sSearch_"+i, "value": oSettings.aoPreSearchCols[i].sSearch } ); - aoData.push( { "name": "bRegex_"+i, "value": oSettings.aoPreSearchCols[i].bRegex } ); - aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } ); - } - } - - /* Sorting */ - if ( oSettings.oFeatures.bSort !== false ) - { - var iCounter = 0; - - aaSort = ( oSettings.aaSortingFixed !== null ) ? - oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : - oSettings.aaSorting.slice(); - - for ( i=0 ; i<aaSort.length ; i++ ) - { - aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort; - - for ( j=0 ; j<aDataSort.length ; j++ ) - { - aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } ); - aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } ); - iCounter++; - } - } - aoData.push( { "name": "iSortingCols", "value": iCounter } ); - - for ( i=0 ; i<iColumns ; i++ ) - { - aoData.push( { "name": "bSortable_"+i, "value": oSettings.aoColumns[i].bSortable } ); - } - } - - return aoData; - } - - - /** - * Add Ajax parameters from plugins - * @param {object} oSettings dataTables settings object - * @param array {objects} aoData name/value pairs to send to the server - * @memberof DataTable#oApi - */ - function _fnServerParams( oSettings, aoData ) - { - _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] ); - } - - - /** - * Data the data from the server (nuking the old) and redraw the table - * @param {object} oSettings dataTables settings object - * @param {object} json json data return from the server. - * @param {string} json.sEcho Tracking flag for DataTables to match requests - * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering - * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering - * @param {array} json.aaData The data to display on this page - * @param {string} [json.sColumns] Column ordering (sName, comma separated) - * @memberof DataTable#oApi - */ - function _fnAjaxUpdateDraw ( oSettings, json ) - { - if ( json.sEcho !== undefined ) - { - /* Protect against old returns over-writing a new one. Possible when you get - * very fast interaction, and later queires are completed much faster - */ - if ( json.sEcho*1 < oSettings.iDraw ) - { - return; - } - else - { - oSettings.iDraw = json.sEcho * 1; - } - } - - if ( !oSettings.oScroll.bInfinite || - (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) ) - { - _fnClearTable( oSettings ); - } - oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10); - oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10); - - /* Determine if reordering is required */ - var sOrdering = _fnColumnOrdering(oSettings); - var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering ); - var aiIndex; - if ( bReOrder ) - { - aiIndex = _fnReOrderIndex( oSettings, json.sColumns ); - } - - var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json ); - for ( var i=0, iLen=aData.length ; i<iLen ; i++ ) - { - if ( bReOrder ) - { - /* If we need to re-order, then create a new array with the correct order and add it */ - var aDataSorted = []; - for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ ) - { - aDataSorted.push( aData[i][ aiIndex[j] ] ); - } - _fnAddData( oSettings, aDataSorted ); - } - else - { - /* No re-order required, sever got it "right" - just straight add */ - _fnAddData( oSettings, aData[i] ); - } - } - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - oSettings.bAjaxDataGet = false; - _fnDraw( oSettings ); - oSettings.bAjaxDataGet = true; - _fnProcessingDisplay( oSettings, false ); - } - - - - /** - * Generate the node required for filtering text - * @returns {node} Filter control element - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlFilter ( oSettings ) - { - var oPreviousSearch = oSettings.oPreviousSearch; - - var sSearchStr = oSettings.oLanguage.sSearch; - sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ? - sSearchStr.replace('_INPUT_', '<input type="text" />') : - sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />'; - - var nFilter = document.createElement( 'div' ); - nFilter.className = oSettings.oClasses.sFilter; - nFilter.innerHTML = '<label>'+sSearchStr+'</label>'; - if ( !oSettings.aanFeatures.f ) - { - nFilter.id = oSettings.sTableId+'_filter'; - } - - var jqFilter = $('input[type="text"]', nFilter); - - // Store a reference to the input element, so other input elements could be - // added to the filter wrapper if needed (submit button for example) - nFilter._DT_Input = jqFilter[0]; - - jqFilter.val( oPreviousSearch.sSearch.replace('"','"') ); - jqFilter.bind( 'keyup.DT', function(e) { - /* Update all other filter input elements for the new display */ - var n = oSettings.aanFeatures.f; - var val = this.value==="" ? "" : this.value; // mental IE8 fix :-( - - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - if ( n[i] != $(this).parents('div.dataTables_filter')[0] ) - { - $(n[i]._DT_Input).val( val ); - } - } - - /* Now do the filter */ - if ( val != oPreviousSearch.sSearch ) - { - _fnFilterComplete( oSettings, { - "sSearch": val, - "bRegex": oPreviousSearch.bRegex, - "bSmart": oPreviousSearch.bSmart , - "bCaseInsensitive": oPreviousSearch.bCaseInsensitive - } ); - } - } ); - - jqFilter - .attr('aria-controls', oSettings.sTableId) - .bind( 'keypress.DT', function(e) { - /* Prevent form submission */ - if ( e.keyCode == 13 ) - { - return false; - } - } - ); - - return nFilter; - } - - - /** - * Filter the table using both the global filter and column based filtering - * @param {object} oSettings dataTables settings object - * @param {object} oSearch search information - * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0) - * @memberof DataTable#oApi - */ - function _fnFilterComplete ( oSettings, oInput, iForce ) - { - var oPrevSearch = oSettings.oPreviousSearch; - var aoPrevSearch = oSettings.aoPreSearchCols; - var fnSaveFilter = function ( oFilter ) { - /* Save the filtering values */ - oPrevSearch.sSearch = oFilter.sSearch; - oPrevSearch.bRegex = oFilter.bRegex; - oPrevSearch.bSmart = oFilter.bSmart; - oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive; - }; - - /* In server-side processing all filtering is done by the server, so no point hanging around here */ - if ( !oSettings.oFeatures.bServerSide ) - { - /* Global filter */ - _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive ); - fnSaveFilter( oInput ); - - /* Now do the individual column filter */ - for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ ) - { - _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, - aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive ); - } - - /* Custom filtering */ - _fnFilterCustom( oSettings ); - } - else - { - fnSaveFilter( oInput ); - } - - /* Tell the draw function we have been filtering */ - oSettings.bFiltered = true; - $(oSettings.oInstance).trigger('filter', oSettings); - - /* Redraw the table */ - oSettings._iDisplayStart = 0; - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - - /* Rebuild search array 'offline' */ - _fnBuildSearchArray( oSettings, 0 ); - } - - - /** - * Apply custom filtering functions - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnFilterCustom( oSettings ) - { - var afnFilters = DataTable.ext.afnFiltering; - for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ ) - { - var iCorrector = 0; - for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ ) - { - var iDisIndex = oSettings.aiDisplay[j-iCorrector]; - - /* Check if we should use this row based on the filtering function */ - if ( !afnFilters[i]( oSettings, _fnGetRowData( oSettings, iDisIndex, 'filter' ), iDisIndex ) ) - { - oSettings.aiDisplay.splice( j-iCorrector, 1 ); - iCorrector++; - } - } - } - } - - - /** - * Filter the table on a per-column basis - * @param {object} oSettings dataTables settings object - * @param {string} sInput string to filter on - * @param {int} iColumn column to filter - * @param {bool} bRegex treat search string as a regular expression or not - * @param {bool} bSmart use smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @memberof DataTable#oApi - */ - function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive ) - { - if ( sInput === "" ) - { - return; - } - - var iIndexCorrector = 0; - var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); - - for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- ) - { - var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ), - oSettings.aoColumns[iColumn].sType ); - if ( ! rpSearch.test( sData ) ) - { - oSettings.aiDisplay.splice( i, 1 ); - iIndexCorrector++; - } - } - } - - - /** - * Filter the data table based on user input and draw the table - * @param {object} oSettings dataTables settings object - * @param {string} sInput string to filter on - * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0) - * @param {bool} bRegex treat as a regular expression or not - * @param {bool} bSmart perform smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @memberof DataTable#oApi - */ - function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive ) - { - var i; - var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); - var oPrevSearch = oSettings.oPreviousSearch; - - /* Check if we are forcing or not - optional parameter */ - if ( !iForce ) - { - iForce = 0; - } - - /* Need to take account of custom filtering functions - always filter */ - if ( DataTable.ext.afnFiltering.length !== 0 ) - { - iForce = 1; - } - - /* - * If the input is blank - we want the full data set - */ - if ( sInput.length <= 0 ) - { - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - } - else - { - /* - * We are starting a new search or the new search string is smaller - * then the old one (i.e. delete). Search from the master array - */ - if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || - oPrevSearch.sSearch.length > sInput.length || iForce == 1 || - sInput.indexOf(oPrevSearch.sSearch) !== 0 ) - { - /* Nuke the old display array - we are going to rebuild it */ - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); - - /* Force a rebuild of the search array */ - _fnBuildSearchArray( oSettings, 1 ); - - /* Search through all records to populate the search array - * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 - * mapping - */ - for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ ) - { - if ( rpSearch.test(oSettings.asDataSearch[i]) ) - { - oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] ); - } - } - } - else - { - /* Using old search array - refine it - do it this way for speed - * Don't have to search the whole master array again - */ - var iIndexCorrector = 0; - - /* Search the current results */ - for ( i=0 ; i<oSettings.asDataSearch.length ; i++ ) - { - if ( ! rpSearch.test(oSettings.asDataSearch[i]) ) - { - oSettings.aiDisplay.splice( i-iIndexCorrector, 1 ); - iIndexCorrector++; - } - } - } - } - } - - - /** - * Create an array which can be quickly search through - * @param {object} oSettings dataTables settings object - * @param {int} iMaster use the master data array - optional - * @memberof DataTable#oApi - */ - function _fnBuildSearchArray ( oSettings, iMaster ) - { - if ( !oSettings.oFeatures.bServerSide ) - { - /* Clear out the old data */ - oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length ); - - var aArray = (iMaster && iMaster===1) ? - oSettings.aiDisplayMaster : oSettings.aiDisplay; - - for ( var i=0, iLen=aArray.length ; i<iLen ; i++ ) - { - oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings, - _fnGetRowData( oSettings, aArray[i], 'filter' ) ); - } - } - } - - - /** - * Create a searchable string from a single data row - * @param {object} oSettings dataTables settings object - * @param {array} aData Row data array to use for the data to search - * @memberof DataTable#oApi - */ - function _fnBuildSearchRow( oSettings, aData ) - { - var sSearch = ''; - if ( oSettings.__nTmpFilter === undefined ) - { - oSettings.__nTmpFilter = document.createElement('div'); - } - var nTmp = oSettings.__nTmpFilter; - - for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ ) - { - if ( oSettings.aoColumns[j].bSearchable ) - { - var sData = aData[j]; - sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' '; - } - } - - /* If it looks like there is an HTML entity in the string, attempt to decode it */ - if ( sSearch.indexOf('&') !== -1 ) - { - nTmp.innerHTML = sSearch; - sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText; - - /* IE and Opera appear to put an newline where there is a <br> tag - remove it */ - sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,""); - } - - return sSearch; - } - - /** - * Build a regular expression object suitable for searching a table - * @param {string} sSearch string to search for - * @param {bool} bRegex treat as a regular expression or not - * @param {bool} bSmart perform smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @returns {RegExp} constructed object - * @memberof DataTable#oApi - */ - function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive ) - { - var asSearch, sRegExpString; - - if ( bSmart ) - { - /* Generate the regular expression to use. Something along the lines of: - * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ - */ - asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' ); - sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$'; - return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" ); - } - else - { - sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch ); - return new RegExp( sSearch, bCaseInsensitive ? "i" : "" ); - } - } - - - /** - * Convert raw data into something that the user can search on - * @param {string} sData data to be modified - * @param {string} sType data type - * @returns {string} search string - * @memberof DataTable#oApi - */ - function _fnDataToSearch ( sData, sType ) - { - if ( typeof DataTable.ext.ofnSearch[sType] === "function" ) - { - return DataTable.ext.ofnSearch[sType]( sData ); - } - else if ( sData === null ) - { - return ''; - } - else if ( sType == "html" ) - { - return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" ); - } - else if ( typeof sData === "string" ) - { - return sData.replace(/[\r\n]/g," "); - } - return sData; - } - - - /** - * scape a string stuch that it can be used in a regular expression - * @param {string} sVal string to escape - * @returns {string} escaped string - * @memberof DataTable#oApi - */ - function _fnEscapeRegex ( sVal ) - { - var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ]; - var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' ); - return sVal.replace(reReplace, '\\$1'); - } - - - - /** - * Generate the node required for the info display - * @param {object} oSettings dataTables settings object - * @returns {node} Information element - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlInfo ( oSettings ) - { - var nInfo = document.createElement( 'div' ); - nInfo.className = oSettings.oClasses.sInfo; - - /* Actions that are to be taken once only for this feature */ - if ( !oSettings.aanFeatures.i ) - { - /* Add draw callback */ - oSettings.aoDrawCallback.push( { - "fn": _fnUpdateInfo, - "sName": "information" - } ); - - /* Add id */ - nInfo.id = oSettings.sTableId+'_info'; - } - oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' ); - - return nInfo; - } - - - /** - * Update the information elements in the display - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnUpdateInfo ( oSettings ) - { - /* Show information about the table */ - if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 ) - { - return; - } - - var - oLang = oSettings.oLanguage, - iStart = oSettings._iDisplayStart+1, - iEnd = oSettings.fnDisplayEnd(), - iMax = oSettings.fnRecordsTotal(), - iTotal = oSettings.fnRecordsDisplay(), - sOut; - - if ( iTotal === 0 && iTotal == iMax ) - { - /* Empty record set */ - sOut = oLang.sInfoEmpty; - } - else if ( iTotal === 0 ) - { - /* Empty record set after filtering */ - sOut = oLang.sInfoEmpty +' '+ oLang.sInfoFiltered; - } - else if ( iTotal == iMax ) - { - /* Normal record set */ - sOut = oLang.sInfo; - } - else - { - /* Record set after filtering */ - sOut = oLang.sInfo +' '+ oLang.sInfoFiltered; - } - - // Convert the macros - sOut += oLang.sInfoPostFix; - sOut = _fnInfoMacros( oSettings, sOut ); - - if ( oLang.fnInfoCallback !== null ) - { - sOut = oLang.fnInfoCallback.call( oSettings.oInstance, - oSettings, iStart, iEnd, iMax, iTotal, sOut ); - } - - var n = oSettings.aanFeatures.i; - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - $(n[i]).html( sOut ); - } - } - - - function _fnInfoMacros ( oSettings, str ) - { - var - iStart = oSettings._iDisplayStart+1, - sStart = oSettings.fnFormatNumber( iStart ), - iEnd = oSettings.fnDisplayEnd(), - sEnd = oSettings.fnFormatNumber( iEnd ), - iTotal = oSettings.fnRecordsDisplay(), - sTotal = oSettings.fnFormatNumber( iTotal ), - iMax = oSettings.fnRecordsTotal(), - sMax = oSettings.fnFormatNumber( iMax ); - - // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only - // internally - if ( oSettings.oScroll.bInfinite ) - { - sStart = oSettings.fnFormatNumber( 1 ); - } - - return str. - replace('_START_', sStart). - replace('_END_', sEnd). - replace('_TOTAL_', sTotal). - replace('_MAX_', sMax); - } - - - - /** - * Draw the table for the first time, adding all required features - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnInitialise ( oSettings ) - { - var i, iLen, iAjaxStart=oSettings.iInitDisplayStart; - - /* Ensure that the table data is fully initialised */ - if ( oSettings.bInitialised === false ) - { - setTimeout( function(){ _fnInitialise( oSettings ); }, 200 ); - return; - } - - /* Show the display HTML options */ - _fnAddOptionsHtml( oSettings ); - - /* Build and draw the header / footer for the table */ - _fnBuildHead( oSettings ); - _fnDrawHead( oSettings, oSettings.aoHeader ); - if ( oSettings.nTFoot ) - { - _fnDrawHead( oSettings, oSettings.aoFooter ); - } - - /* Okay to show that something is going on now */ - _fnProcessingDisplay( oSettings, true ); - - /* Calculate sizes for columns */ - if ( oSettings.oFeatures.bAutoWidth ) - { - _fnCalculateColumnWidths( oSettings ); - } - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( oSettings.aoColumns[i].sWidth !== null ) - { - oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth ); - } - } - - /* If there is default sorting required - let's do it. The sort function will do the - * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows - * the table to look initialised for Ajax sourcing data (show 'loading' message possibly) - */ - if ( oSettings.oFeatures.bSort ) - { - _fnSort( oSettings ); - } - else if ( oSettings.oFeatures.bFilter ) - { - _fnFilterComplete( oSettings, oSettings.oPreviousSearch ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - /* if there is an ajax source load the data */ - if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide ) - { - var aoData = []; - _fnServerParams( oSettings, aoData ); - oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) { - var aData = (oSettings.sAjaxDataProp !== "") ? - _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json; - - /* Got the data - add it to the table */ - for ( i=0 ; i<aData.length ; i++ ) - { - _fnAddData( oSettings, aData[i] ); - } - - /* Reset the init display for cookie saving. We've already done a filter, and - * therefore cleared it before. So we need to make it appear 'fresh' - */ - oSettings.iInitDisplayStart = iAjaxStart; - - if ( oSettings.oFeatures.bSort ) - { - _fnSort( oSettings ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - _fnProcessingDisplay( oSettings, false ); - _fnInitComplete( oSettings, json ); - }, oSettings ); - return; - } - - /* Server-side processing initialisation complete is done at the end of _fnDraw */ - if ( !oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - _fnInitComplete( oSettings ); - } - } - - - /** - * Draw the table for the first time, adding all required features - * @param {object} oSettings dataTables settings object - * @param {object} [json] JSON from the server that completed the table, if using Ajax source - * with client-side processing (optional) - * @memberof DataTable#oApi - */ - function _fnInitComplete ( oSettings, json ) - { - oSettings._bInitComplete = true; - _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] ); - } - - - /** - * Language compatibility - when certain options are given, and others aren't, we - * need to duplicate the values over, in order to provide backwards compatibility - * with older language files. - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnLanguageCompat( oLanguage ) - { - var oDefaults = DataTable.defaults.oLanguage; - - /* Backwards compatibility - if there is no sEmptyTable given, then use the same as - * sZeroRecords - assuming that is given. - */ - if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords && - oDefaults.sEmptyTable === "No data available in table" ) - { - _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' ); - } - - /* Likewise with loading records */ - if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords && - oDefaults.sLoadingRecords === "Loading..." ) - { - _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' ); - } - } - - - - /** - * Generate the node required for user display length changing - * @param {object} oSettings dataTables settings object - * @returns {node} Display length feature node - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlLength ( oSettings ) - { - if ( oSettings.oScroll.bInfinite ) - { - return null; - } - - /* This can be overruled by not using the _MENU_ var/macro in the language variable */ - var sName = 'name="'+oSettings.sTableId+'_length"'; - var sStdMenu = '<select size="1" '+sName+'>'; - var i, iLen; - var aLengthMenu = oSettings.aLengthMenu; - - if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && - typeof aLengthMenu[1] === 'object' ) - { - for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ ) - { - sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>'; - } - } - else - { - for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ ) - { - sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>'; - } - } - sStdMenu += '</select>'; - - var nLength = document.createElement( 'div' ); - if ( !oSettings.aanFeatures.l ) - { - nLength.id = oSettings.sTableId+'_length'; - } - nLength.className = oSettings.oClasses.sLength; - nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>'; - - /* - * Set the length to the current display length - thanks to Andrea Pavlovic for this fix, - * and Stefan Skopnik for fixing the fix! - */ - $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true); - - $('select', nLength).bind( 'change.DT', function(e) { - var iVal = $(this).val(); - - /* Update all other length options for the new display */ - var n = oSettings.aanFeatures.l; - for ( i=0, iLen=n.length ; i<iLen ; i++ ) - { - if ( n[i] != this.parentNode ) - { - $('select', n[i]).val( iVal ); - } - } - - /* Redraw the table */ - oSettings._iDisplayLength = parseInt(iVal, 10); - _fnCalculateEnd( oSettings ); - - /* If we have space to show extra rows (backing up from the end point - then do so */ - if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength; - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - - if ( oSettings._iDisplayLength == -1 ) - { - oSettings._iDisplayStart = 0; - } - - _fnDraw( oSettings ); - } ); - - - $('select', nLength).attr('aria-controls', oSettings.sTableId); - - return nLength; - } - - - /** - * Rcalculate the end point based on the start point - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnCalculateEnd( oSettings ) - { - if ( oSettings.oFeatures.bPaginate === false ) - { - oSettings._iDisplayEnd = oSettings.aiDisplay.length; - } - else - { - /* Set the end point of the display - based on how many elements there are - * still to display - */ - if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length || - oSettings._iDisplayLength == -1 ) - { - oSettings._iDisplayEnd = oSettings.aiDisplay.length; - } - else - { - oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; - } - } - } - - - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Note that most of the paging logic is done in - * DataTable.ext.oPagination - */ - - /** - * Generate the node required for default pagination - * @param {object} oSettings dataTables settings object - * @returns {node} Pagination feature node - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlPaginate ( oSettings ) - { - if ( oSettings.oScroll.bInfinite ) - { - return null; - } - - var nPaginate = document.createElement( 'div' ); - nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType; - - DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, - function( oSettings ) { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - ); - - /* Add a draw callback for the pagination on first instance, to update the paging display */ - if ( !oSettings.aanFeatures.p ) - { - oSettings.aoDrawCallback.push( { - "fn": function( oSettings ) { - DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } ); - }, - "sName": "pagination" - } ); - } - return nPaginate; - } - - - /** - * Alter the display settings to change the page - * @param {object} oSettings dataTables settings object - * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" - * or page number to jump to (integer) - * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1 - * @memberof DataTable#oApi - */ - function _fnPageChange ( oSettings, mAction ) - { - var iOldStart = oSettings._iDisplayStart; - - if ( typeof mAction === "number" ) - { - oSettings._iDisplayStart = mAction * oSettings._iDisplayLength; - if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "first" ) - { - oSettings._iDisplayStart = 0; - } - else if ( mAction == "previous" ) - { - oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? - oSettings._iDisplayStart - oSettings._iDisplayLength : - 0; - - /* Correct for underrun */ - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "next" ) - { - if ( oSettings._iDisplayLength >= 0 ) - { - /* Make sure we are not over running the display array */ - if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart += oSettings._iDisplayLength; - } - } - else - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "last" ) - { - if ( oSettings._iDisplayLength >= 0 ) - { - var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1; - oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength; - } - else - { - oSettings._iDisplayStart = 0; - } - } - else - { - _fnLog( oSettings, 0, "Unknown paging action: "+mAction ); - } - $(oSettings.oInstance).trigger('page', oSettings); - - return iOldStart != oSettings._iDisplayStart; - } - - - - /** - * Generate the node required for the processing node - * @param {object} oSettings dataTables settings object - * @returns {node} Processing element - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlProcessing ( oSettings ) - { - var nProcessing = document.createElement( 'div' ); - - if ( !oSettings.aanFeatures.r ) - { - nProcessing.id = oSettings.sTableId+'_processing'; - } - nProcessing.innerHTML = oSettings.oLanguage.sProcessing; - nProcessing.className = oSettings.oClasses.sProcessing; - oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable ); - - return nProcessing; - } - - - /** - * Display or hide the processing indicator - * @param {object} oSettings dataTables settings object - * @param {bool} bShow Show the processing indicator (true) or not (false) - * @memberof DataTable#oApi - */ - function _fnProcessingDisplay ( oSettings, bShow ) - { - if ( oSettings.oFeatures.bProcessing ) - { - var an = oSettings.aanFeatures.r; - for ( var i=0, iLen=an.length ; i<iLen ; i++ ) - { - an[i].style.visibility = bShow ? "visible" : "hidden"; - } - } - - $(oSettings.oInstance).trigger('processing', [oSettings, bShow]); - } - - - - /** - * Add any control elements for the table - specifically scrolling - * @param {object} oSettings dataTables settings object - * @returns {node} Node to add to the DOM - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlTable ( oSettings ) - { - /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */ - if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" ) - { - return oSettings.nTable; - } - - /* - * The HTML structure that we want to generate in this function is: - * div - nScroller - * div - nScrollHead - * div - nScrollHeadInner - * table - nScrollHeadTable - * thead - nThead - * div - nScrollBody - * table - oSettings.nTable - * thead - nTheadSize - * tbody - nTbody - * div - nScrollFoot - * div - nScrollFootInner - * table - nScrollFootTable - * tfoot - nTfoot - */ - var - nScroller = document.createElement('div'), - nScrollHead = document.createElement('div'), - nScrollHeadInner = document.createElement('div'), - nScrollBody = document.createElement('div'), - nScrollFoot = document.createElement('div'), - nScrollFootInner = document.createElement('div'), - nScrollHeadTable = oSettings.nTable.cloneNode(false), - nScrollFootTable = oSettings.nTable.cloneNode(false), - nThead = oSettings.nTable.getElementsByTagName('thead')[0], - nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : - oSettings.nTable.getElementsByTagName('tfoot')[0], - oClasses = oSettings.oClasses; - - nScrollHead.appendChild( nScrollHeadInner ); - nScrollFoot.appendChild( nScrollFootInner ); - nScrollBody.appendChild( oSettings.nTable ); - nScroller.appendChild( nScrollHead ); - nScroller.appendChild( nScrollBody ); - nScrollHeadInner.appendChild( nScrollHeadTable ); - nScrollHeadTable.appendChild( nThead ); - if ( nTfoot !== null ) - { - nScroller.appendChild( nScrollFoot ); - nScrollFootInner.appendChild( nScrollFootTable ); - nScrollFootTable.appendChild( nTfoot ); - } - - nScroller.className = oClasses.sScrollWrapper; - nScrollHead.className = oClasses.sScrollHead; - nScrollHeadInner.className = oClasses.sScrollHeadInner; - nScrollBody.className = oClasses.sScrollBody; - nScrollFoot.className = oClasses.sScrollFoot; - nScrollFootInner.className = oClasses.sScrollFootInner; - - if ( oSettings.oScroll.bAutoCss ) - { - nScrollHead.style.overflow = "hidden"; - nScrollHead.style.position = "relative"; - nScrollFoot.style.overflow = "hidden"; - nScrollBody.style.overflow = "auto"; - } - - nScrollHead.style.border = "0"; - nScrollHead.style.width = "100%"; - nScrollFoot.style.border = "0"; - nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ? - oSettings.oScroll.sXInner : "100%"; /* will be overwritten */ - - /* Modify attributes to respect the clones */ - nScrollHeadTable.removeAttribute('id'); - nScrollHeadTable.style.marginLeft = "0"; - oSettings.nTable.style.marginLeft = "0"; - if ( nTfoot !== null ) - { - nScrollFootTable.removeAttribute('id'); - nScrollFootTable.style.marginLeft = "0"; - } - - /* Move caption elements from the body to the header, footer or leave where it is - * depending on the configuration. Note that the DTD says there can be only one caption */ - var nCaption = $(oSettings.nTable).children('caption'); - if ( nCaption.length > 0 ) - { - nCaption = nCaption[0]; - if ( nCaption._captionSide === "top" ) - { - nScrollHeadTable.appendChild( nCaption ); - } - else if ( nCaption._captionSide === "bottom" && nTfoot ) - { - nScrollFootTable.appendChild( nCaption ); - } - } - - /* - * Sizing - */ - /* When xscrolling add the width and a scroller to move the header with the body */ - if ( oSettings.oScroll.sX !== "" ) - { - nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX ); - nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX ); - - if ( nTfoot !== null ) - { - nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX ); - } - - /* When the body is scrolled, then we also want to scroll the headers */ - $(nScrollBody).scroll( function (e) { - nScrollHead.scrollLeft = this.scrollLeft; - - if ( nTfoot !== null ) - { - nScrollFoot.scrollLeft = this.scrollLeft; - } - } ); - } - - /* When yscrolling, add the height */ - if ( oSettings.oScroll.sY !== "" ) - { - nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY ); - } - - /* Redraw - align columns across the tables */ - oSettings.aoDrawCallback.push( { - "fn": _fnScrollDraw, - "sName": "scrolling" - } ); - - /* Infinite scrolling event handlers */ - if ( oSettings.oScroll.bInfinite ) - { - $(nScrollBody).scroll( function() { - /* Use a blocker to stop scrolling from loading more data while other data is still loading */ - if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 ) - { - /* Check if we should load the next data set */ - if ( $(this).scrollTop() + $(this).height() > - $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) - { - /* Only do the redraw if we have to - we might be at the end of the data */ - if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() ) - { - _fnPageChange( oSettings, 'next' ); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - } - } ); - } - - oSettings.nScrollHead = nScrollHead; - oSettings.nScrollFoot = nScrollFoot; - - return nScroller; - } - - - /** - * Update the various tables for resizing. It's a bit of a pig this function, but - * basically the idea to: - * 1. Re-create the table inside the scrolling div - * 2. Take live measurements from the DOM - * 3. Apply the measurements - * 4. Clean up - * @param {object} o dataTables settings object - * @returns {node} Node to add to the DOM - * @memberof DataTable#oApi - */ - function _fnScrollDraw ( o ) - { - var - nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0], - nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], - nScrollBody = o.nTable.parentNode, - i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis, - nTheadSize, nTfootSize, - iWidth, aApplied=[], iSanityWidth, - nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null, - nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null, - ie67 = $.browser.msie && $.browser.version <= 7; - - /* - * 1. Re-create the table inside the scrolling div - */ - - /* Remove the old minimised thead and tfoot elements in the inner table */ - $(o.nTable).children('thead, tfoot').remove(); - - /* Clone the current header and footer elements and then place it into the inner table */ - nTheadSize = $(o.nTHead).clone()[0]; - o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] ); - - if ( o.nTFoot !== null ) - { - nTfootSize = $(o.nTFoot).clone()[0]; - o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] ); - } - - /* - * 2. Take live measurements from the DOM - do not alter the DOM itself! - */ - - /* Remove old sizing and apply the calculated column widths - * Get the unique column headers in the newly created (cloned) header. We want to apply the - * calclated sizes to this header - */ - if ( o.oScroll.sX === "" ) - { - nScrollBody.style.width = '100%'; - nScrollHeadInner.parentNode.style.width = '100%'; - } - - var nThs = _fnGetUniqueThs( o, nTheadSize ); - for ( i=0, iLen=nThs.length ; i<iLen ; i++ ) - { - iVis = _fnVisibleToColumnIndex( o, i ); - nThs[i].style.width = o.aoColumns[iVis].sWidth; - } - - if ( o.nTFoot !== null ) - { - _fnApplyToChildren( function(n) { - n.style.width = ""; - }, nTfootSize.getElementsByTagName('tr') ); - } - - // If scroll collapse is enabled, when we put the headers back into the body for sizing, we - // will end up forcing the scrollbar to appear, making our measurements wrong for when we - // then hide it (end of this function), so add the header height to the body scroller. - if ( o.oScroll.bCollapse && o.oScroll.sY !== "" ) - { - nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px"; - } - - /* Size the table as a whole */ - iSanityWidth = $(o.nTable).outerWidth(); - if ( o.oScroll.sX === "" ) - { - /* No x scrolling */ - o.nTable.style.width = "100%"; - - /* I know this is rubbish - but IE7 will make the width of the table when 100% include - * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this - * into account. - */ - if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || - $(nScrollBody).css('overflow-y') == "scroll") ) - { - o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); - } - } - else - { - if ( o.oScroll.sXInner !== "" ) - { - /* x scroll inner has been given - use it */ - o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner); - } - else if ( iSanityWidth == $(nScrollBody).width() && - $(nScrollBody).height() < $(o.nTable).height() ) - { - /* There is y-scrolling - try to take account of the y scroll bar */ - o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth ); - if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth ) - { - /* Not possible to take account of it */ - o.nTable.style.width = _fnStringToCss( iSanityWidth ); - } - } - else - { - /* All else fails */ - o.nTable.style.width = _fnStringToCss( iSanityWidth ); - } - } - - /* Recalculate the sanity width - now that we've applied the required width, before it was - * a temporary variable. This is required because the column width calculation is done - * before this table DOM is created. - */ - iSanityWidth = $(o.nTable).outerWidth(); - - /* We want the hidden header to have zero height, so remove padding and borders. Then - * set the width based on the real headers - */ - anHeadToSize = o.nTHead.getElementsByTagName('tr'); - anHeadSizers = nTheadSize.getElementsByTagName('tr'); - - _fnApplyToChildren( function(nSizer, nToSize) { - oStyle = nSizer.style; - oStyle.paddingTop = "0"; - oStyle.paddingBottom = "0"; - oStyle.borderTopWidth = "0"; - oStyle.borderBottomWidth = "0"; - oStyle.height = 0; - - iWidth = $(nSizer).width(); - nToSize.style.width = _fnStringToCss( iWidth ); - aApplied.push( iWidth ); - }, anHeadSizers, anHeadToSize ); - $(anHeadSizers).height(0); - - if ( o.nTFoot !== null ) - { - /* Clone the current footer and then place it into the body table as a "hidden header" */ - anFootSizers = nTfootSize.getElementsByTagName('tr'); - anFootToSize = o.nTFoot.getElementsByTagName('tr'); - - _fnApplyToChildren( function(nSizer, nToSize) { - oStyle = nSizer.style; - oStyle.paddingTop = "0"; - oStyle.paddingBottom = "0"; - oStyle.borderTopWidth = "0"; - oStyle.borderBottomWidth = "0"; - oStyle.height = 0; - - iWidth = $(nSizer).width(); - nToSize.style.width = _fnStringToCss( iWidth ); - aApplied.push( iWidth ); - }, anFootSizers, anFootToSize ); - $(anFootSizers).height(0); - } - - /* - * 3. Apply the measurements - */ - - /* "Hide" the header and footer that we used for the sizing. We want to also fix their width - * to what they currently are - */ - _fnApplyToChildren( function(nSizer) { - nSizer.innerHTML = ""; - nSizer.style.width = _fnStringToCss( aApplied.shift() ); - }, anHeadSizers ); - - if ( o.nTFoot !== null ) - { - _fnApplyToChildren( function(nSizer) { - nSizer.innerHTML = ""; - nSizer.style.width = _fnStringToCss( aApplied.shift() ); - }, anFootSizers ); - } - - /* Sanity check that the table is of a sensible width. If not then we are going to get - * misalignment - try to prevent this by not allowing the table to shrink below its min width - */ - if ( $(o.nTable).outerWidth() < iSanityWidth ) - { - /* The min width depends upon if we have a vertical scrollbar visible or not */ - var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || - $(nScrollBody).css('overflow-y') == "scroll")) ? - iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; - - /* IE6/7 are a law unto themselves... */ - if ( ie67 && (nScrollBody.scrollHeight > - nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) - { - o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); - } - - /* Apply the calculated minimum width to the table wrappers */ - nScrollBody.style.width = _fnStringToCss( iCorrection ); - nScrollHeadInner.parentNode.style.width = _fnStringToCss( iCorrection ); - - if ( o.nTFoot !== null ) - { - nScrollFootInner.parentNode.style.width = _fnStringToCss( iCorrection ); - } - - /* And give the user a warning that we've stopped the table getting too small */ - if ( o.oScroll.sX === "" ) - { - _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ - " misalignment. The table has been drawn at its minimum possible width." ); - } - else if ( o.oScroll.sXInner !== "" ) - { - _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ - " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+ - " calculation" ); - } - } - else - { - nScrollBody.style.width = _fnStringToCss( '100%' ); - nScrollHeadInner.parentNode.style.width = _fnStringToCss( '100%' ); - - if ( o.nTFoot !== null ) - { - nScrollFootInner.parentNode.style.width = _fnStringToCss( '100%' ); - } - } - - - /* - * 4. Clean up - */ - if ( o.oScroll.sY === "" ) - { - /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting - * the scrollbar height from the visible display, rather than adding it on. We need to - * set the height in order to sort this. Don't want to do it in any other browsers. - */ - if ( ie67 ) - { - nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth ); - } - } - - if ( o.oScroll.sY !== "" && o.oScroll.bCollapse ) - { - nScrollBody.style.height = _fnStringToCss( o.oScroll.sY ); - - var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ? - o.oScroll.iBarWidth : 0; - if ( o.nTable.offsetHeight < nScrollBody.offsetHeight ) - { - nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra ); - } - } - - /* Finally set the width's of the header and footer tables */ - var iOuterWidth = $(o.nTable).outerWidth(); - nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth ); - nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth ); - - // Figure out if there are scrollbar present - if so then we need a the header and footer to - // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) - var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll"; - nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; - - if ( o.nTFoot !== null ) - { - nScrollFootTable.style.width = _fnStringToCss( iOuterWidth ); - nScrollFootInner.style.width = _fnStringToCss( iOuterWidth ); - nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; - } - - /* Adjust the position of the header incase we loose the y-scrollbar */ - $(nScrollBody).scroll(); - - /* If sorting or filtering has occurred, jump the scrolling back to the top */ - if ( o.bSorted || o.bFiltered ) - { - nScrollBody.scrollTop = 0; - } - } - - - /** - * Apply a given function to the display child nodes of an element array (typically - * TD children of TR rows - * @param {function} fn Method to apply to the objects - * @param array {nodes} an1 List of elements to look through for display children - * @param array {nodes} an2 Another list (identical structure to the first) - optional - * @memberof DataTable#oApi - */ - function _fnApplyToChildren( fn, an1, an2 ) - { - for ( var i=0, iLen=an1.length ; i<iLen ; i++ ) - { - for ( var j=0, jLen=an1[i].childNodes.length ; j<jLen ; j++ ) - { - if ( an1[i].childNodes[j].nodeType == 1 ) - { - if ( an2 ) - { - fn( an1[i].childNodes[j], an2[i].childNodes[j] ); - } - else - { - fn( an1[i].childNodes[j] ); - } - } - } - } - } - - - - /** - * Convert a CSS unit width to pixels (e.g. 2em) - * @param {string} sWidth width to be converted - * @param {node} nParent parent to get the with for (required for relative widths) - optional - * @returns {int} iWidth width in pixels - * @memberof DataTable#oApi - */ - function _fnConvertToWidth ( sWidth, nParent ) - { - if ( !sWidth || sWidth === null || sWidth === '' ) - { - return 0; - } - - if ( !nParent ) - { - nParent = document.getElementsByTagName('body')[0]; - } - - var iWidth; - var nTmp = document.createElement( "div" ); - nTmp.style.width = _fnStringToCss( sWidth ); - - nParent.appendChild( nTmp ); - iWidth = nTmp.offsetWidth; - nParent.removeChild( nTmp ); - - return ( iWidth ); - } - - - /** - * Calculate the width of columns for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnCalculateColumnWidths ( oSettings ) - { - var iTableWidth = oSettings.nTable.offsetWidth; - var iUserInputs = 0; - var iTmpWidth; - var iVisibleColumns = 0; - var iColums = oSettings.aoColumns.length; - var i, iIndex, iCorrector, iWidth; - var oHeaders = $('th', oSettings.nTHead); - var widthAttr = oSettings.nTable.getAttribute('width'); - - /* Convert any user input sizes into pixel sizes */ - for ( i=0 ; i<iColums ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - iVisibleColumns++; - - if ( oSettings.aoColumns[i].sWidth !== null ) - { - iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, - oSettings.nTable.parentNode ); - if ( iTmpWidth !== null ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth ); - } - - iUserInputs++; - } - } - } - - /* If the number of columns in the DOM equals the number that we have to process in - * DataTables, then we can use the offsets that are created by the web-browser. No custom - * sizes can be set in order for this to happen, nor scrolling used - */ - if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums && - oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" ) - { - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - iTmpWidth = $(oHeaders[i]).width(); - if ( iTmpWidth !== null ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth ); - } - } - } - else - { - /* Otherwise we are going to have to do some calculations to get the width of each column. - * Construct a 1 row table with the widest node in the data, and any user defined widths, - * then insert it into the DOM and allow the browser to do all the hard work of - * calculating table widths. - */ - var - nCalcTmp = oSettings.nTable.cloneNode( false ), - nTheadClone = oSettings.nTHead.cloneNode(true), - nBody = document.createElement( 'tbody' ), - nTr = document.createElement( 'tr' ), - nDivSizing; - - nCalcTmp.removeAttribute( "id" ); - nCalcTmp.appendChild( nTheadClone ); - if ( oSettings.nTFoot !== null ) - { - nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) ); - _fnApplyToChildren( function(n) { - n.style.width = ""; - }, nCalcTmp.getElementsByTagName('tr') ); - } - - nCalcTmp.appendChild( nBody ); - nBody.appendChild( nTr ); - - /* Remove any sizing that was previously applied by the styles */ - var jqColSizing = $('thead th', nCalcTmp); - if ( jqColSizing.length === 0 ) - { - jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp); - } - - /* Apply custom sizing to the cloned header */ - var nThs = _fnGetUniqueThs( oSettings, nTheadClone ); - iCorrector = 0; - for ( i=0 ; i<iColums ; i++ ) - { - var oColumn = oSettings.aoColumns[i]; - if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" ) - { - nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig ); - } - else if ( oColumn.bVisible ) - { - nThs[i-iCorrector].style.width = ""; - } - else - { - iCorrector++; - } - } - - /* Find the biggest td for each column and put it into the table */ - for ( i=0 ; i<iColums ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - var nTd = _fnGetWidestNode( oSettings, i ); - if ( nTd !== null ) - { - nTd = nTd.cloneNode(true); - if ( oSettings.aoColumns[i].sContentPadding !== "" ) - { - nTd.innerHTML += oSettings.aoColumns[i].sContentPadding; - } - nTr.appendChild( nTd ); - } - } - } - - /* Build the table and 'display' it */ - var nWrapper = oSettings.nTable.parentNode; - nWrapper.appendChild( nCalcTmp ); - - /* When scrolling (X or Y) we want to set the width of the table as appropriate. However, - * when not scrolling leave the table width as it is. This results in slightly different, - * but I think correct behaviour - */ - if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" ) - { - nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner); - } - else if ( oSettings.oScroll.sX !== "" ) - { - nCalcTmp.style.width = ""; - if ( $(nCalcTmp).width() < nWrapper.offsetWidth ) - { - nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth ); - } - } - else if ( oSettings.oScroll.sY !== "" ) - { - nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth ); - } - else if ( widthAttr ) - { - nCalcTmp.style.width = _fnStringToCss( widthAttr ); - } - nCalcTmp.style.visibility = "hidden"; - - /* Scrolling considerations */ - _fnScrollingWidthAdjust( oSettings, nCalcTmp ); - - /* Read the width's calculated by the browser and store them for use by the caller. We - * first of all try to use the elements in the body, but it is possible that there are - * no elements there, under which circumstances we use the header elements - */ - var oNodes = $("tbody tr:eq(0)", nCalcTmp).children(); - if ( oNodes.length === 0 ) - { - oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] ); - } - - /* Browsers need a bit of a hand when a width is assigned to any columns when - * x-scrolling as they tend to collapse the table to the min-width, even if - * we sent the column widths. So we need to keep track of what the table width - * should be by summing the user given values, and the automatic values - */ - if ( oSettings.oScroll.sX !== "" ) - { - var iTotal = 0; - iCorrector = 0; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - if ( oSettings.aoColumns[i].sWidthOrig === null ) - { - iTotal += $(oNodes[iCorrector]).outerWidth(); - } - else - { - iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) + - ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width()); - } - iCorrector++; - } - } - - nCalcTmp.style.width = _fnStringToCss( iTotal ); - oSettings.nTable.style.width = _fnStringToCss( iTotal ); - } - - iCorrector = 0; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - iWidth = $(oNodes[iCorrector]).width(); - if ( iWidth !== null && iWidth > 0 ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth ); - } - iCorrector++; - } - } - - var cssWidth = $(nCalcTmp).css('width'); - oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ? - cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() ); - nCalcTmp.parentNode.removeChild( nCalcTmp ); - } - - if ( widthAttr ) - { - oSettings.nTable.style.width = _fnStringToCss( widthAttr ); - } - } - - - /** - * Adjust a table's width to take account of scrolling - * @param {object} oSettings dataTables settings object - * @param {node} n table node - * @memberof DataTable#oApi - */ - function _fnScrollingWidthAdjust ( oSettings, n ) - { - if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" ) - { - /* When y-scrolling only, we want to remove the width of the scroll bar so the table - * + scroll bar will fit into the area avaialble. - */ - var iOrigWidth = $(n).width(); - n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth ); - } - else if ( oSettings.oScroll.sX !== "" ) - { - /* When x-scrolling both ways, fix the table at it's current size, without adjusting */ - n.style.width = _fnStringToCss( $(n).outerWidth() ); - } - } - - - /** - * Get the widest node - * @param {object} oSettings dataTables settings object - * @param {int} iCol column of interest - * @returns {string} max strlens for each column - * @memberof DataTable#oApi - */ - function _fnGetWidestNode( oSettings, iCol ) - { - var iMaxIndex = _fnGetMaxLenString( oSettings, iCol ); - if ( iMaxIndex < 0 ) - { - return null; - } - - if ( oSettings.aoData[iMaxIndex].nTr === null ) - { - var n = document.createElement('td'); - n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' ); - return n; - } - return _fnGetTdNodes(oSettings, iMaxIndex)[iCol]; - } - - - /** - * Get the maximum strlen for each data column - * @param {object} oSettings dataTables settings object - * @param {int} iCol column of interest - * @returns {string} max strlens for each column - * @memberof DataTable#oApi - */ - function _fnGetMaxLenString( oSettings, iCol ) - { - var iMax = -1; - var iMaxIndex = -1; - - for ( var i=0 ; i<oSettings.aoData.length ; i++ ) - { - var s = _fnGetCellData( oSettings, i, iCol, 'display' )+""; - s = s.replace( /<.*?>/g, "" ); - if ( s.length > iMax ) - { - iMax = s.length; - iMaxIndex = i; - } - } - - return iMaxIndex; - } - - - /** - * Append a CSS unit (only if required) to a string - * @param {array} aArray1 first array - * @param {array} aArray2 second array - * @returns {int} 0 if match, 1 if length is different, 2 if no match - * @memberof DataTable#oApi - */ - function _fnStringToCss( s ) - { - if ( s === null ) - { - return "0px"; - } - - if ( typeof s == 'number' ) - { - if ( s < 0 ) - { - return "0px"; - } - return s+"px"; - } - - /* Check if the last character is not 0-9 */ - var c = s.charCodeAt( s.length-1 ); - if (c < 0x30 || c > 0x39) - { - return s; - } - return s+"px"; - } - - - /** - * Get the width of a scroll bar in this browser being used - * @returns {int} width in pixels - * @memberof DataTable#oApi - */ - function _fnScrollBarWidth () - { - var inner = document.createElement('p'); - var style = inner.style; - style.width = "100%"; - style.height = "200px"; - style.padding = "0px"; - - var outer = document.createElement('div'); - style = outer.style; - style.position = "absolute"; - style.top = "0px"; - style.left = "0px"; - style.visibility = "hidden"; - style.width = "200px"; - style.height = "150px"; - style.padding = "0px"; - style.overflow = "hidden"; - outer.appendChild(inner); - - document.body.appendChild(outer); - var w1 = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var w2 = inner.offsetWidth; - if ( w1 == w2 ) - { - w2 = outer.clientWidth; - } - - document.body.removeChild(outer); - return (w1 - w2); - } - - - - /** - * Change the order of the table - * @param {object} oSettings dataTables settings object - * @param {bool} bApplyClasses optional - should we apply classes or not - * @memberof DataTable#oApi - */ - function _fnSort ( oSettings, bApplyClasses ) - { - var - i, iLen, j, jLen, k, kLen, - sDataType, nTh, - aaSort = [], - aiOrig = [], - oSort = DataTable.ext.oSort, - aoData = oSettings.aoData, - aoColumns = oSettings.aoColumns, - oAria = oSettings.oLanguage.oAria; - - /* No sorting required if server-side or no sorting array */ - if ( !oSettings.oFeatures.bServerSide && - (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) - { - aaSort = ( oSettings.aaSortingFixed !== null ) ? - oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : - oSettings.aaSorting.slice(); - - /* If there is a sorting data type, and a fuction belonging to it, then we need to - * get the data from the developer's function and apply it for this column - */ - for ( i=0 ; i<aaSort.length ; i++ ) - { - var iColumn = aaSort[i][0]; - var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn ); - sDataType = oSettings.aoColumns[ iColumn ].sSortDataType; - if ( DataTable.ext.afnSortData[sDataType] ) - { - var aData = DataTable.ext.afnSortData[sDataType].call( - oSettings.oInstance, oSettings, iColumn, iVisColumn - ); - if ( aData.length === aoData.length ) - { - for ( j=0, jLen=aoData.length ; j<jLen ; j++ ) - { - _fnSetCellData( oSettings, j, iColumn, aData[j] ); - } - } - else - { - _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" ); - } - } - } - - /* Create a value - key array of the current row positions such that we can use their - * current position during the sort, if values match, in order to perform stable sorting - */ - for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ ) - { - aiOrig[ oSettings.aiDisplayMaster[i] ] = i; - } - - /* Build an internal data array which is specific to the sort, so we can get and prep - * the data to be sorted only once, rather than needing to do it every time the sorting - * function runs. This make the sorting function a very simple comparison - */ - var iSortLen = aaSort.length; - var fnSortFormat, aDataSort; - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - for ( j=0 ; j<iSortLen ; j++ ) - { - aDataSort = aoColumns[ aaSort[j][0] ].aDataSort; - - for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ ) - { - sDataType = aoColumns[ aDataSort[k] ].sType; - fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ]; - - aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ? - fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) : - _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ); - } - } - } - - /* Do the sort - here we want multi-column sorting based on a given data source (column) - * and sorting function (from oSort) in a certain direction. It's reasonably complex to - * follow on it's own, but this is what we want (example two column sorting): - * fnLocalSorting = function(a,b){ - * var iTest; - * iTest = oSort['string-asc']('data11', 'data12'); - * if (iTest !== 0) - * return iTest; - * iTest = oSort['numeric-desc']('data21', 'data22'); - * if (iTest !== 0) - * return iTest; - * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); - * } - * Basically we have a test for each sorting column, if the data in that column is equal, - * test the next column. If all columns match, then we use a numeric sort on the row - * positions in the original data array to provide a stable sort. - */ - oSettings.aiDisplayMaster.sort( function ( a, b ) { - var k, l, lLen, iTest, aDataSort, sDataType; - for ( k=0 ; k<iSortLen ; k++ ) - { - aDataSort = aoColumns[ aaSort[k][0] ].aDataSort; - - for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ ) - { - sDataType = aoColumns[ aDataSort[l] ].sType; - - iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ]( - aoData[a]._aSortData[ aDataSort[l] ], - aoData[b]._aSortData[ aDataSort[l] ] - ); - - if ( iTest !== 0 ) - { - return iTest; - } - } - } - - return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); - } ); - } - - /* Alter the sorting classes to take account of the changes */ - if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender ) - { - _fnSortingClasses( oSettings ); - } - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" ); - nTh = aoColumns[i].nTh; - nTh.removeAttribute('aria-sort'); - nTh.removeAttribute('aria-label'); - - /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ - if ( aoColumns[i].bSortable ) - { - if ( aaSort.length > 0 && aaSort[0][0] == i ) - { - nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); - - var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? - aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; - nTh.setAttribute('aria-label', sTitle+ - (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); - } - else - { - nTh.setAttribute('aria-label', sTitle+ - (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); - } - } - else - { - nTh.setAttribute('aria-label', sTitle); - } - } - - /* Tell the draw function that we have sorted the data */ - oSettings.bSorted = true; - $(oSettings.oInstance).trigger('sort', oSettings); - - /* Copy the master data into the draw array and re-draw */ - if ( oSettings.oFeatures.bFilter ) - { - /* _fnFilter() will redraw the table for us */ - _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - oSettings._iDisplayStart = 0; /* reset display back to page 0 */ - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - - - /** - * Attach a sort handler (click) to a node - * @param {object} oSettings dataTables settings object - * @param {node} nNode node to attach the handler to - * @param {int} iDataIndex column sorting index - * @param {function} [fnCallback] callback function - * @memberof DataTable#oApi - */ - function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback ) - { - _fnBindAction( nNode, {}, function (e) { - /* If the column is not sortable - don't to anything */ - if ( oSettings.aoColumns[iDataIndex].bSortable === false ) - { - return; - } - - /* - * This is a little bit odd I admit... I declare a temporary function inside the scope of - * _fnBuildHead and the click handler in order that the code presented here can be used - * twice - once for when bProcessing is enabled, and another time for when it is - * disabled, as we need to perform slightly different actions. - * Basically the issue here is that the Javascript engine in modern browsers don't - * appear to allow the rendering engine to update the display while it is still excuting - * it's thread (well - it does but only after long intervals). This means that the - * 'processing' display doesn't appear for a table sort. To break the js thread up a bit - * I force an execution break by using setTimeout - but this breaks the expected - * thread continuation for the end-developer's point of view (their code would execute - * too early), so we on;y do it when we absolutely have to. - */ - var fnInnerSorting = function () { - var iColumn, iNextSort; - - /* If the shift key is pressed then we are multipe column sorting */ - if ( e.shiftKey ) - { - /* Are we already doing some kind of sort on this column? */ - var bFound = false; - for ( var i=0 ; i<oSettings.aaSorting.length ; i++ ) - { - if ( oSettings.aaSorting[i][0] == iDataIndex ) - { - bFound = true; - iColumn = oSettings.aaSorting[i][0]; - iNextSort = oSettings.aaSorting[i][2]+1; - - if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] ) - { - /* Reached the end of the sorting options, remove from multi-col sort */ - oSettings.aaSorting.splice( i, 1 ); - } - else - { - /* Move onto next sorting direction */ - oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort]; - oSettings.aaSorting[i][2] = iNextSort; - } - break; - } - } - - /* No sort yet - add it in */ - if ( bFound === false ) - { - oSettings.aaSorting.push( [ iDataIndex, - oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); - } - } - else - { - /* If no shift key then single column sort */ - if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex ) - { - iColumn = oSettings.aaSorting[0][0]; - iNextSort = oSettings.aaSorting[0][2]+1; - if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] ) - { - iNextSort = 0; - } - oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort]; - oSettings.aaSorting[0][2] = iNextSort; - } - else - { - oSettings.aaSorting.splice( 0, oSettings.aaSorting.length ); - oSettings.aaSorting.push( [ iDataIndex, - oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); - } - } - - /* Run the sort */ - _fnSort( oSettings ); - }; /* /fnInnerSorting */ - - if ( !oSettings.oFeatures.bProcessing ) - { - fnInnerSorting(); - } - else - { - _fnProcessingDisplay( oSettings, true ); - setTimeout( function() { - fnInnerSorting(); - if ( !oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - } - }, 0 ); - } - - /* Call the user specified callback function - used for async user interaction */ - if ( typeof fnCallback == 'function' ) - { - fnCallback( oSettings ); - } - } ); - } - - - /** - * Set the sorting classes on the header, Note: it is safe to call this function - * when bSort and bSortClasses are false - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSortingClasses( oSettings ) - { - var i, iLen, j, jLen, iFound; - var aaSort, sClass; - var iColumns = oSettings.aoColumns.length; - var oClasses = oSettings.oClasses; - - for ( i=0 ; i<iColumns ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable ) - { - $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc + - " "+ oSettings.aoColumns[i].sSortingClass ); - } - } - - if ( oSettings.aaSortingFixed !== null ) - { - aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting ); - } - else - { - aaSort = oSettings.aaSorting.slice(); - } - - /* Apply the required classes to the header */ - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable ) - { - sClass = oSettings.aoColumns[i].sSortingClass; - iFound = -1; - for ( j=0 ; j<aaSort.length ; j++ ) - { - if ( aaSort[j][0] == i ) - { - sClass = ( aaSort[j][1] == "asc" ) ? - oClasses.sSortAsc : oClasses.sSortDesc; - iFound = j; - break; - } - } - $(oSettings.aoColumns[i].nTh).addClass( sClass ); - - if ( oSettings.bJUI ) - { - /* jQuery UI uses extra markup */ - var jqSpan = $("span."+oClasses.sSortIcon, oSettings.aoColumns[i].nTh); - jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ - oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed ); - - var sSpanClass; - if ( iFound == -1 ) - { - sSpanClass = oSettings.aoColumns[i].sSortingClassJUI; - } - else if ( aaSort[iFound][1] == "asc" ) - { - sSpanClass = oClasses.sSortJUIAsc; - } - else - { - sSpanClass = oClasses.sSortJUIDesc; - } - - jqSpan.addClass( sSpanClass ); - } - } - else - { - /* No sorting on this column, so add the base class. This will have been assigned by - * _fnAddColumn - */ - $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass ); - } - } - - /* - * Apply the required classes to the table body - * Note that this is given as a feature switch since it can significantly slow down a sort - * on large data sets (adding and removing of classes is always slow at the best of times..) - * Further to this, note that this code is admitadly fairly ugly. It could be made a lot - * simpiler using jQuery selectors and add/removeClass, but that is significantly slower - * (on the order of 5 times slower) - hence the direct DOM manipulation here. - * Note that for defered drawing we do use jQuery - the reason being that taking the first - * row found to see if the whole column needs processed can miss classes since the first - * column might be new. - */ - sClass = oClasses.sSortColumn; - - if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses ) - { - var nTds = _fnGetTdNodes( oSettings ); - - /* Remove the old classes */ - if ( oSettings.oFeatures.bDeferRender ) - { - $(nTds).removeClass(sClass+'1 '+sClass+'2 '+sClass+'3'); - } - else if ( nTds.length >= iColumns ) - { - for ( i=0 ; i<iColumns ; i++ ) - { - if ( nTds[i].className.indexOf(sClass+"1") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) ); - } - } - else if ( nTds[i].className.indexOf(sClass+"2") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) ); - } - } - else if ( nTds[i].className.indexOf(sClass+"3") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) ); - } - } - } - } - - /* Add the new classes to the table */ - var iClass = 1, iTargetCol; - for ( i=0 ; i<aaSort.length ; i++ ) - { - iTargetCol = parseInt( aaSort[i][0], 10 ); - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass; - } - - if ( iClass < 3 ) - { - iClass++; - } - } - } - } - - - - /** - * Save the state of a table in a cookie such that the page can be reloaded - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSaveState ( oSettings ) - { - if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying ) - { - return; - } - - /* Store the interesting variables */ - var i, iLen, bInfinite=oSettings.oScroll.bInfinite; - var oState = { - "iCreate": new Date().getTime(), - "iStart": (bInfinite ? 0 : oSettings._iDisplayStart), - "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd), - "iLength": oSettings._iDisplayLength, - "aaSorting": $.extend( true, [], oSettings.aaSorting ), - "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ), - "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ), - "abVisCols": [] - }; - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oState.abVisCols.push( oSettings.aoColumns[i].bVisible ); - } - - _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] ); - - oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState ); - } - - - /** - * Attempt to load a saved table state from a cookie - * @param {object} oSettings dataTables settings object - * @param {object} oInit DataTables init object so we can override settings - * @memberof DataTable#oApi - */ - function _fnLoadState ( oSettings, oInit ) - { - if ( !oSettings.oFeatures.bStateSave ) - { - return; - } - - var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings ); - if ( !oData ) - { - return; - } - - /* Allow custom and plug-in manipulation functions to alter the saved data set and - * cancelling of loading by returning false - */ - var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] ); - if ( $.inArray( false, abStateLoad ) !== -1 ) - { - return; - } - - /* Store the saved state so it might be accessed at any time */ - oSettings.oLoadedState = $.extend( true, {}, oData ); - - /* Restore key features */ - oSettings._iDisplayStart = oData.iStart; - oSettings.iInitDisplayStart = oData.iStart; - oSettings._iDisplayEnd = oData.iEnd; - oSettings._iDisplayLength = oData.iLength; - oSettings.aaSorting = oData.aaSorting.slice(); - oSettings.saved_aaSorting = oData.aaSorting.slice(); - - /* Search filtering */ - $.extend( oSettings.oPreviousSearch, oData.oSearch ); - $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols ); - - /* Column visibility state - * Pass back visibiliy settings to the init handler, but to do not here override - * the init object that the user might have passed in - */ - oInit.saved_aoColumns = []; - for ( var i=0 ; i<oData.abVisCols.length ; i++ ) - { - oInit.saved_aoColumns[i] = {}; - oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i]; - } - - _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] ); - } - - - /** - * Create a new cookie with a value to store the state of a table - * @param {string} sName name of the cookie to create - * @param {string} sValue the value the cookie should take - * @param {int} iSecs duration of the cookie - * @param {string} sBaseName sName is made up of the base + file name - this is the base - * @param {function} fnCallback User definable function to modify the cookie - * @memberof DataTable#oApi - */ - function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback ) - { - var date = new Date(); - date.setTime( date.getTime()+(iSecs*1000) ); - - /* - * Shocking but true - it would appear IE has major issues with having the path not having - * a trailing slash on it. We need the cookie to be available based on the path, so we - * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the - * patch to use at least some of the path - */ - var aParts = window.location.pathname.split('/'); - var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase(); - var sFullCookie, oData; - - if ( fnCallback !== null ) - { - oData = (typeof $.parseJSON === 'function') ? - $.parseJSON( sValue ) : eval( '('+sValue+')' ); - sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(), - aParts.join('/')+"/" ); - } - else - { - sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) + - "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/"; - } - - /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies - * belonging to DataTables. This is FAR from bullet proof - */ - var sOldName="", iOldTime=9999999999999; - var iLength = _fnReadCookie( sNameFile )!==null ? document.cookie.length : - sFullCookie.length + document.cookie.length; - - if ( iLength+10 > 4096 ) /* Magic 10 for padding */ - { - var aCookies =document.cookie.split(';'); - for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ ) - { - if ( aCookies[i].indexOf( sBaseName ) != -1 ) - { - /* It's a DataTables cookie, so eval it and check the time stamp */ - var aSplitCookie = aCookies[i].split('='); - try { oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' ); } - catch( e ) { continue; } - - if ( oData.iCreate && oData.iCreate < iOldTime ) - { - sOldName = aSplitCookie[0]; - iOldTime = oData.iCreate; - } - } - } - - if ( sOldName !== "" ) - { - document.cookie = sOldName+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+ - aParts.join('/') + "/"; - } - } - - document.cookie = sFullCookie; - } - - - /** - * Read an old cookie to get a cookie with an old table state - * @param {string} sName name of the cookie to read - * @returns {string} contents of the cookie - or null if no cookie with that name found - * @memberof DataTable#oApi - */ - function _fnReadCookie ( sName ) - { - var - aParts = window.location.pathname.split('/'), - sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=', - sCookieContents = document.cookie.split(';'); - - for( var i=0 ; i<sCookieContents.length ; i++ ) - { - var c = sCookieContents[i]; - - while (c.charAt(0)==' ') - { - c = c.substring(1,c.length); - } - - if (c.indexOf(sNameEQ) === 0) - { - return decodeURIComponent( c.substring(sNameEQ.length,c.length) ); - } - } - return null; - } - - - - /** - * Return the settings object for a particular table - * @param {node} nTable table we are using as a dataTable - * @returns {object} Settings object - or null if not found - * @memberof DataTable#oApi - */ - function _fnSettingsFromNode ( nTable ) - { - for ( var i=0 ; i<DataTable.settings.length ; i++ ) - { - if ( DataTable.settings[i].nTable === nTable ) - { - return DataTable.settings[i]; - } - } - - return null; - } - - - /** - * Return an array with the TR nodes for the table - * @param {object} oSettings dataTables settings object - * @returns {array} TR array - * @memberof DataTable#oApi - */ - function _fnGetTrNodes ( oSettings ) - { - var aNodes = []; - var aoData = oSettings.aoData; - for ( var i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - aNodes.push( aoData[i].nTr ); - } - } - return aNodes; - } - - - /** - * Return an flat array with all TD nodes for the table, or row - * @param {object} oSettings dataTables settings object - * @param {int} [iIndividualRow] aoData index to get the nodes for - optional - * if not given then the return array will contain all nodes for the table - * @returns {array} TD array - * @memberof DataTable#oApi - */ - function _fnGetTdNodes ( oSettings, iIndividualRow ) - { - var anReturn = []; - var iCorrector; - var anTds; - var iRow, iRows=oSettings.aoData.length, - iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows; - - /* Allow the collection to be limited to just one row */ - if ( iIndividualRow !== undefined ) - { - iStart = iIndividualRow; - iEnd = iIndividualRow+1; - } - - for ( iRow=iStart ; iRow<iEnd ; iRow++ ) - { - oData = oSettings.aoData[iRow]; - if ( oData.nTr !== null ) - { - /* get the TD child nodes - taking into account text etc nodes */ - anTds = []; - for ( iColumn=0, iColumns=oData.nTr.childNodes.length ; iColumn<iColumns ; iColumn++ ) - { - sNodeName = oData.nTr.childNodes[iColumn].nodeName.toLowerCase(); - if ( sNodeName == 'td' || sNodeName == 'th' ) - { - anTds.push( oData.nTr.childNodes[iColumn] ); - } - } - - iCorrector = 0; - for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ ) - { - if ( oSettings.aoColumns[iColumn].bVisible ) - { - anReturn.push( anTds[iColumn-iCorrector] ); - } - else - { - anReturn.push( oData._anHidden[iColumn] ); - iCorrector++; - } - } - } - } - - return anReturn; - } - - - /** - * Log an error message - * @param {object} oSettings dataTables settings object - * @param {int} iLevel log error messages, or display them to the user - * @param {string} sMesg error message - * @memberof DataTable#oApi - */ - function _fnLog( oSettings, iLevel, sMesg ) - { - var sAlert = (oSettings===null) ? - "DataTables warning: "+sMesg : - "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg; - - if ( iLevel === 0 ) - { - if ( DataTable.ext.sErrMode == 'alert' ) - { - alert( sAlert ); - } - else - { - throw new Error(sAlert); - } - return; - } - else if ( window.console && console.log ) - { - console.log( sAlert ); - } - } - - - /** - * See if a property is defined on one object, if so assign it to the other object - * @param {object} oRet target object - * @param {object} oSrc source object - * @param {string} sName property - * @param {string} [sMappedName] name to map too - optional, sName used if not given - * @memberof DataTable#oApi - */ - function _fnMap( oRet, oSrc, sName, sMappedName ) - { - if ( sMappedName === undefined ) - { - sMappedName = sName; - } - if ( oSrc[sName] !== undefined ) - { - oRet[sMappedName] = oSrc[sName]; - } - } - - - /** - * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow - * copy arrays. The reason we need to do this, is that we don't want to deep copy array - * init values (such as aaSorting) since the dev wouldn't be able to override them, but - * we do want to deep copy arrays. - * @param {object} oOut Object to extend - * @param {object} oExtender Object from which the properties will be applied to oOut - * @returns {object} oOut Reference, just for convenience - oOut === the return. - * @memberof DataTable#oApi - * @todo This doesn't take account of arrays inside the deep copied objects. - */ - function _fnExtend( oOut, oExtender ) - { - for ( var prop in oExtender ) - { - if ( oExtender.hasOwnProperty(prop) ) - { - if ( typeof oInit[prop] === 'object' && $.isArray(oExtender[prop]) === false ) - { - $.extend( true, oOut[prop], oExtender[prop] ); - } - else - { - oOut[prop] = oExtender[prop]; - } - } - } - - return oOut; - } - - - /** - * Bind an event handers to allow a click or return key to activate the callback. - * This is good for accessability since a return on the keyboard will have the - * same effect as a click, if the element has focus. - * @param {element} n Element to bind the action to - * @param {object} oData Data object to pass to the triggered function - * @param {function} fn Callback function for when the event is triggered - * @memberof DataTable#oApi - */ - function _fnBindAction( n, oData, fn ) - { - $(n) - .bind( 'click.DT', oData, function (e) { - n.blur(); // Remove focus outline for mouse users - fn(e); - } ) - .bind( 'keypress.DT', oData, function (e){ - if ( e.which === 13 ) { - fn(e); - } } ) - .bind( 'selectstart.DT', function () { - /* Take the brutal approach to cancelling text selection */ - return false; - } ); - } - - - /** - * Register a callback function. Easily allows a callback function to be added to - * an array store of callback functions that can then all be called together. - * @param {object} oSettings dataTables settings object - * @param {string} sStore Name of the array storeage for the callbacks in oSettings - * @param {function} fn Function to be called back - * @param {string} sName Identifying name for the callback (i.e. a label) - * @memberof DataTable#oApi - */ - function _fnCallbackReg( oSettings, sStore, fn, sName ) - { - if ( fn ) - { - oSettings[sStore].push( { - "fn": fn, - "sName": sName - } ); - } - } - - - /** - * Fire callback functions and trigger events. Note that the loop over the callback - * array store is done backwards! Further note that you do not want to fire off triggers - * in time sensitive applications (for example cell creation) as its slow. - * @param {object} oSettings dataTables settings object - * @param {string} sStore Name of the array storeage for the callbacks in oSettings - * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger - * is fired - * @param {array} aArgs Array of arguments to pass to the callback function / trigger - * @memberof DataTable#oApi - */ - function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs ) - { - var aoStore = oSettings[sStore]; - var aRet =[]; - - for ( var i=aoStore.length-1 ; i>=0 ; i-- ) - { - aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) ); - } - - if ( sTrigger !== null ) - { - $(oSettings.oInstance).trigger(sTrigger, aArgs); - } - - return aRet; - } - - - /** - * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other - * library, then we use that as it is fast, safe and accurate. If the function isn't - * available then we need to built it ourselves - the insperation for this function comes - * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is - * not perfect and absolutely should not be used as a replacement to json2.js - but it does - * do what we need, without requiring a dependency for DataTables. - * @param {object} o JSON object to be converted - * @returns {string} JSON string - * @memberof DataTable#oApi - */ - var _fnJsonString = (window.JSON) ? JSON.stringify : function( o ) - { - /* Not an object or array */ - var sType = typeof o; - if (sType !== "object" || o === null) - { - // simple data type - if (sType === "string") - { - o = '"'+o+'"'; - } - return o+""; - } - - /* If object or array, need to recurse over it */ - var - sProp, mValue, - json = [], - bArr = $.isArray(o); - - for (sProp in o) - { - mValue = o[sProp]; - sType = typeof mValue; - - if (sType === "string") - { - mValue = '"'+mValue+'"'; - } - else if (sType === "object" && mValue !== null) - { - mValue = _fnJsonString(mValue); - } - - json.push((bArr ? "" : '"'+sProp+'":') + mValue); - } - - return (bArr ? "[" : "{") + json + (bArr ? "]" : "}"); - }; - - - - - /** - * Perform a jQuery selector action on the table's TR elements (from the tbody) and - * return the resulting jQuery object. - * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on - * @param {object} [oOpts] Optional parameters for modifying the rows to be included - * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter - * criterion ("applied") or all TR elements (i.e. no filter). - * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. - * Can be either 'current', whereby the current sorting of the table is used, or - * 'original' whereby the original order the data was read into the table is used. - * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be - * 'current' and filter is 'applied', regardless of what they might be given as. - * @returns {object} jQuery object, filtered by the given selector. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Highlight every second row - * oTable.$('tr:odd').css('backgroundColor', 'blue'); - * } ); - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Filter to rows with 'Webkit' in them, add a background colour and then - * // remove the filter, thus highlighting the 'Webkit' rows only. - * oTable.fnFilter('Webkit'); - * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue'); - * oTable.fnFilter(''); - * } ); - */ - this.$ = function ( sSelector, oOpts ) - { - var i, iLen, a = [], tr; - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var aoData = oSettings.aoData; - var aiDisplay = oSettings.aiDisplay; - var aiDisplayMaster = oSettings.aiDisplayMaster; - - if ( !oOpts ) - { - oOpts = {}; - } - - oOpts = $.extend( {}, { - "filter": "none", // applied - "order": "current", // "original" - "page": "all" // current - }, oOpts ); - - // Current page implies that order=current and fitler=applied, since it is fairly - // senseless otherwise - if ( oOpts.page == 'current' ) - { - for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplay[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "current" && oOpts.filter == "none" ) - { - for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplayMaster[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "current" && oOpts.filter == "applied" ) - { - for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplay[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "original" && oOpts.filter == "none" ) - { - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - tr = aoData[ i ].nTr ; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "original" && oOpts.filter == "applied" ) - { - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - tr = aoData[ i ].nTr; - if ( $.inArray( i, aiDisplay ) !== -1 && tr ) - { - a.push( tr ); - } - } - } - else - { - _fnLog( oSettings, 1, "Unknown selection options" ); - } - - /* We need to filter on the TR elements and also 'find' in their descendants - * to make the selector act like it would in a full table - so we need - * to build both results and then combine them together - */ - var jqA = $(a); - var jqTRs = jqA.filter( sSelector ); - var jqDescendants = jqA.find( sSelector ); - - return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) ); - }; - - - /** - * Almost identical to $ in operation, but in this case returns the data for the matched - * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes - * rather than any decendents, so the data can be obtained for the row/cell. If matching - * rows are found, the data returned is the original data array/object that was used to - * create the row (or a generated array if from a DOM source). - * - * This method is often useful incombination with $ where both functions are given the - * same parameters and the array indexes will match identically. - * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on - * @param {object} [oOpts] Optional parameters for modifying the rows to be included - * @param {string} [oOpts.filter=none] Select elements that meet the current filter - * criterion ("applied") or all elements (i.e. no filter). - * @param {string} [oOpts.order=current] Order of the data in the processed array. - * Can be either 'current', whereby the current sorting of the table is used, or - * 'original' whereby the original order the data was read into the table is used. - * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be - * 'current' and filter is 'applied', regardless of what they might be given as. - * @returns {array} Data for the matched elements. If any elements, as a result of the - * selector, were not TR, TD or TH elements in the DataTable, they will have a null - * entry in the array. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Get the data from the first row in the table - * var data = oTable._('tr:first'); - * - * // Do something useful with the data - * alert( "First cell is: "+data[0] ); - * } ); - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Filter to 'Webkit' and get all data for - * oTable.fnFilter('Webkit'); - * var data = oTable._('tr', {"filter": "applied"}); - * - * // Do something with the data - * alert( data.length+" rows matched the filter" ); - * } ); - */ - this._ = function ( sSelector, oOpts ) - { - var aOut = []; - var i, iLen, iIndex; - var aTrs = this.$( sSelector, oOpts ); - - for ( i=0, iLen=aTrs.length ; i<iLen ; i++ ) - { - aOut.push( this.fnGetData(aTrs[i]) ); - } - - return aOut; - }; - - - /** - * Add a single new row or multiple rows of data to the table. Please note - * that this is suitable for client-side processing only - if you are using - * server-side processing (i.e. "bServerSide": true), then to add data, you - * must add it to the data source, i.e. the server-side, through an Ajax call. - * @param {array|object} mData The data to be added to the table. This can be: - * <ul> - * <li>1D array of data - add a single row with the data provided</li> - * <li>2D array of arrays - add multiple rows in a single call</li> - * <li>object - data object when using <i>mDataProp</i></li> - * <li>array of objects - multiple data objects when using <i>mDataProp</i></li> - * </ul> - * @param {bool} [bRedraw=true] redraw the table or not - * @returns {array} An array of integers, representing the list of indexes in - * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to - * the table. - * @dtopt API - * - * @example - * // Global var for counter - * var giCount = 2; - * - * $(document).ready(function() { - * $('#example').dataTable(); - * } ); - * - * function fnClickAddRow() { - * $('#example').dataTable().fnAddData( [ - * giCount+".1", - * giCount+".2", - * giCount+".3", - * giCount+".4" ] - * ); - * - * giCount++; - * } - */ - this.fnAddData = function( mData, bRedraw ) - { - if ( mData.length === 0 ) - { - return []; - } - - var aiReturn = []; - var iTest; - - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - /* Check if we want to add multiple rows or not */ - if ( typeof mData[0] === "object" && mData[0] !== null ) - { - for ( var i=0 ; i<mData.length ; i++ ) - { - iTest = _fnAddData( oSettings, mData[i] ); - if ( iTest == -1 ) - { - return aiReturn; - } - aiReturn.push( iTest ); - } - } - else - { - iTest = _fnAddData( oSettings, mData ); - if ( iTest == -1 ) - { - return aiReturn; - } - aiReturn.push( iTest ); - } - - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - if ( bRedraw === undefined || bRedraw ) - { - _fnReDraw( oSettings ); - } - return aiReturn; - }; - - - /** - * This function will make DataTables recalculate the column sizes, based on the data - * contained in the table and the sizes applied to the columns (in the DOM, CSS or - * through the sWidth parameter). This can be useful when the width of the table's - * parent element changes (for example a window resize). - * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * - * $(window).bind('resize', function () { - * oTable.fnAdjustColumnSizing(); - * } ); - * } ); - */ - this.fnAdjustColumnSizing = function ( bRedraw ) - { - var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]); - _fnAdjustColumnSizing( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - this.fnDraw( false ); - } - else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) - { - /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */ - this.oApi._fnScrollDraw(oSettings); - } - }; - - - /** - * Quickly and simply clear a table - * @param {bool} [bRedraw=true] redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...) - * oTable.fnClearTable(); - * } ); - */ - this.fnClearTable = function( bRedraw ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - _fnClearTable( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - _fnDraw( oSettings ); - } - }; - - - /** - * The exact opposite of 'opening' a row, this function will close any rows which - * are currently 'open'. - * @param {node} nTr the table row to 'close' - * @returns {int} 0 on success, or 1 if failed (can't find the row) - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnClose = function( nTr ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ ) - { - if ( oSettings.aoOpenRows[i].nParent == nTr ) - { - var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode; - if ( nTrParent ) - { - /* Remove it if it is currently on display */ - nTrParent.removeChild( oSettings.aoOpenRows[i].nTr ); - } - oSettings.aoOpenRows.splice( i, 1 ); - return 0; - } - } - return 1; - }; - - - /** - * Remove a row for the table - * @param {mixed} mTarget The index of the row from aoData to be deleted, or - * the TR element you want to delete - * @param {function|null} [fnCallBack] Callback function - * @param {bool} [bRedraw=true] Redraw the table or not - * @returns {array} The row that was deleted - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Immediately remove the first row - * oTable.fnDeleteRow( 0 ); - * } ); - */ - this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen, iAODataIndex; - - iAODataIndex = (typeof mTarget === 'object') ? - _fnNodeToDataIndex(oSettings, mTarget) : mTarget; - - /* Return the data array from this row */ - var oData = oSettings.aoData.splice( iAODataIndex, 1 ); - - /* Update the _DT_RowIndex parameter */ - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - if ( oSettings.aoData[i].nTr !== null ) - { - oSettings.aoData[i].nTr._DT_RowIndex = i; - } - } - - /* Remove the target row from the search array */ - var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay ); - oSettings.asDataSearch.splice( iDisplayIndex, 1 ); - - /* Delete from the display arrays */ - _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex ); - _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex ); - - /* If there is a user callback function - call it */ - if ( typeof fnCallBack === "function" ) - { - fnCallBack.call( this, oSettings, oData ); - } - - /* Check for an 'overflow' they case for displaying the table */ - if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart -= oSettings._iDisplayLength; - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - - if ( bRedraw === undefined || bRedraw ) - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - return oData; - }; - - - /** - * Restore the table to it's original state in the DOM by removing all of DataTables - * enhancements, alterations to the DOM structure of the table and event listeners. - * @param {boolean} [bRemove=false] Completely remove the table from the DOM - * @dtopt API - * - * @example - * $(document).ready(function() { - * // This example is fairly pointless in reality, but shows how fnDestroy can be used - * var oTable = $('#example').dataTable(); - * oTable.fnDestroy(); - * } ); - */ - this.fnDestroy = function ( bRemove ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var nOrig = oSettings.nTableWrapper.parentNode; - var nBody = oSettings.nTBody; - var i, iLen; - - bRemove = (bRemove===undefined) ? false : true; - - /* Flag to note that the table is currently being destroyed - no action should be taken */ - oSettings.bDestroying = true; - - /* Fire off the destroy callbacks for plug-ins etc */ - _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] ); - - /* Restore hidden columns */ - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === false ) - { - this.fnSetColumnVis( i, true ); - } - } - - /* Blitz all DT events */ - $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT'); - - /* If there is an 'empty' indicator row, remove it */ - $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove(); - - /* When scrolling we had to break the table up - restore it */ - if ( oSettings.nTable != oSettings.nTHead.parentNode ) - { - $(oSettings.nTable).children('thead').remove(); - oSettings.nTable.appendChild( oSettings.nTHead ); - } - - if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode ) - { - $(oSettings.nTable).children('tfoot').remove(); - oSettings.nTable.appendChild( oSettings.nTFoot ); - } - - /* Remove the DataTables generated nodes, events and classes */ - oSettings.nTable.parentNode.removeChild( oSettings.nTable ); - $(oSettings.nTableWrapper).remove(); - - oSettings.aaSorting = []; - oSettings.aaSortingFixed = []; - _fnSortingClasses( oSettings ); - - $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') ); - - $('th, td', oSettings.nTHead).removeClass( [ - oSettings.oClasses.sSortable, - oSettings.oClasses.sSortableAsc, - oSettings.oClasses.sSortableDesc, - oSettings.oClasses.sSortableNone ].join(' ') - ); - if ( oSettings.bJUI ) - { - $('th span.'+oSettings.oClasses.sSortIcon - + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove(); - - $('th, td', oSettings.nTHead).each( function () { - var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this); - var kids = jqWrapper.contents(); - $(this).append( kids ); - jqWrapper.remove(); - } ); - } - - /* Add the TR elements back into the table in their original order */ - if ( !bRemove && oSettings.nTableReinsertBefore ) - { - nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore ); - } - else if ( !bRemove ) - { - nOrig.appendChild( oSettings.nTable ); - } - - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - if ( oSettings.aoData[i].nTr !== null ) - { - nBody.appendChild( oSettings.aoData[i].nTr ); - } - } - - /* Restore the width of the original table */ - if ( oSettings.oFeatures.bAutoWidth === true ) - { - oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth); - } - - /* If the were originally odd/even type classes - then we add them back here. Note - * this is not fool proof (for example if not all rows as odd/even classes - but - * it's a good effort without getting carried away - */ - $(nBody).children('tr:even').addClass( oSettings.asDestroyStripes[0] ); - $(nBody).children('tr:odd').addClass( oSettings.asDestroyStripes[1] ); - - /* Remove the settings object from the settings array */ - for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ ) - { - if ( DataTable.settings[i] == oSettings ) - { - DataTable.settings.splice( i, 1 ); - } - } - - /* End it all */ - oSettings = null; - }; - - - /** - * Redraw the table - * @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Re-draw the table - you wouldn't want to do it here, but it's an example :-) - * oTable.fnDraw(); - * } ); - */ - this.fnDraw = function( bComplete ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - if ( bComplete === false ) - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - else - { - _fnReDraw( oSettings ); - } - }; - - - /** - * Filter the input based on data - * @param {string} sInput String to filter the table on - * @param {int|null} [iColumn] Column to limit filtering to - * @param {bool} [bRegex=false] Treat as regular expression or not - * @param {bool} [bSmart=true] Perform smart filtering or not - * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es) - * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false) - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sometime later - filter... - * oTable.fnFilter( 'test string' ); - * } ); - */ - this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( !oSettings.oFeatures.bFilter ) - { - return; - } - - if ( bRegex === undefined || bRegex === null ) - { - bRegex = false; - } - - if ( bSmart === undefined || bSmart === null ) - { - bSmart = true; - } - - if ( bShowGlobal === undefined || bShowGlobal === null ) - { - bShowGlobal = true; - } - - if ( bCaseInsensitive === undefined || bCaseInsensitive === null ) - { - bCaseInsensitive = true; - } - - if ( iColumn === undefined || iColumn === null ) - { - /* Global filter */ - _fnFilterComplete( oSettings, { - "sSearch":sInput+"", - "bRegex": bRegex, - "bSmart": bSmart, - "bCaseInsensitive": bCaseInsensitive - }, 1 ); - - if ( bShowGlobal && oSettings.aanFeatures.f ) - { - var n = oSettings.aanFeatures.f; - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - $(n[i]._DT_Input).val( sInput ); - } - } - } - else - { - /* Single column filter */ - $.extend( oSettings.aoPreSearchCols[ iColumn ], { - "sSearch": sInput+"", - "bRegex": bRegex, - "bSmart": bSmart, - "bCaseInsensitive": bCaseInsensitive - } ); - _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); - } - }; - - - /** - * Get the data for the whole table, an individual row or an individual cell based on the - * provided parameters. - * @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as - * a TR node then the data source for the whole row will be returned. If given as a - * TD/TH cell node then iCol will be automatically calculated and the data for the - * cell returned. If given as an integer, then this is treated as the aoData internal - * data index for the row (see fnGetPosition) and the data for that row used. - * @param {int} [iCol] Optional column index that you want the data of. - * @returns {array|object|string} If mRow is undefined, then the data for all rows is - * returned. If mRow is defined, just data for that row, and is iCol is - * defined, only data for the designated cell is returned. - * @dtopt API - * - * @example - * // Row data - * $(document).ready(function() { - * oTable = $('#example').dataTable(); - * - * oTable.$('tr').click( function () { - * var data = oTable.fnGetData( this ); - * // ... do something with the array / object of data for the row - * } ); - * } ); - * - * @example - * // Individual cell data - * $(document).ready(function() { - * oTable = $('#example').dataTable(); - * - * oTable.$('td').click( function () { - * var sData = oTable.fnGetData( this ); - * alert( 'The cell clicked on had the value of '+sData ); - * } ); - * } ); - */ - this.fnGetData = function( mRow, iCol ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( mRow !== undefined ) - { - var iRow = mRow; - if ( typeof mRow === 'object' ) - { - var sNode = mRow.nodeName.toLowerCase(); - if (sNode === "tr" ) - { - iRow = _fnNodeToDataIndex(oSettings, mRow); - } - else if ( sNode === "td" ) - { - iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode); - iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow ); - } - } - - if ( iCol !== undefined ) - { - return _fnGetCellData( oSettings, iRow, iCol, '' ); - } - return (oSettings.aoData[iRow]!==undefined) ? - oSettings.aoData[iRow]._aData : null; - } - return _fnGetDataMaster( oSettings ); - }; - - - /** - * Get an array of the TR nodes that are used in the table's body. Note that you will - * typically want to use the '$' API method in preference to this as it is more - * flexible. - * @param {int} [iRow] Optional row index for the TR element you want - * @returns {array|node} If iRow is undefined, returns an array of all TR elements - * in the table's body, or iRow is defined, just the TR element requested. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Get the nodes from the table - * var nNodes = oTable.fnGetNodes( ); - * } ); - */ - this.fnGetNodes = function( iRow ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( iRow !== undefined ) { - return (oSettings.aoData[iRow]!==undefined) ? - oSettings.aoData[iRow].nTr : null; - } - return _fnGetTrNodes( oSettings ); - }; - - - /** - * Get the array indexes of a particular cell from it's DOM element - * and column index including hidden columns - * @param {node} nNode this can either be a TR, TD or TH in the table's body - * @returns {int} If nNode is given as a TR, then a single index is returned, or - * if given as a cell, an array of [row index, column index (visible)] is given. - * @dtopt API - * - * @example - * $(document).ready(function() { - * $('#example tbody td').click( function () { - * // Get the position of the current data from the node - * var aPos = oTable.fnGetPosition( this ); - * - * // Get the data array for this row - * var aData = oTable.fnGetData( aPos[0] ); - * - * // Update the data array and return the value - * aData[ aPos[1] ] = 'clicked'; - * this.innerHTML = 'clicked'; - * } ); - * - * // Init DataTables - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnGetPosition = function( nNode ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var sNodeName = nNode.nodeName.toUpperCase(); - - if ( sNodeName == "TR" ) - { - return _fnNodeToDataIndex(oSettings, nNode); - } - else if ( sNodeName == "TD" || sNodeName == "TH" ) - { - var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode ); - var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode ); - return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ]; - } - return null; - }; - - - /** - * Check to see if a row is 'open' or not. - * @param {node} nTr the table row to check - * @returns {boolean} true if the row is currently open, false otherwise - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnIsOpen = function( nTr ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var aoOpenRows = oSettings.aoOpenRows; - - for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ ) - { - if ( oSettings.aoOpenRows[i].nParent == nTr ) - { - return true; - } - } - return false; - }; - - - /** - * This function will place a new row directly after a row which is currently - * on display on the page, with the HTML contents that is passed into the - * function. This can be used, for example, to ask for confirmation that a - * particular record should be deleted. - * @param {node} nTr The table row to 'open' - * @param {string|node|jQuery} mHtml The HTML to put into the row - * @param {string} sClass Class to give the new TD cell - * @returns {node} The row opened. Note that if the table row passed in as the - * first parameter, is not found in the table, this method will silently - * return. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnOpen = function( nTr, mHtml, sClass ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - /* Check that the row given is in the table */ - var nTableRows = _fnGetTrNodes( oSettings ); - if ( $.inArray(nTr, nTableRows) === -1 ) - { - return; - } - - /* the old open one if there is one */ - this.fnClose( nTr ); - - var nNewRow = document.createElement("tr"); - var nNewCell = document.createElement("td"); - nNewRow.appendChild( nNewCell ); - nNewCell.className = sClass; - nNewCell.colSpan = _fnVisbleColumns( oSettings ); - - if (typeof mHtml === "string") - { - nNewCell.innerHTML = mHtml; - } - else - { - $(nNewCell).html( mHtml ); - } - - /* If the nTr isn't on the page at the moment - then we don't insert at the moment */ - var nTrs = $('tr', oSettings.nTBody); - if ( $.inArray(nTr, nTrs) != -1 ) - { - $(nNewRow).insertAfter(nTr); - } - - oSettings.aoOpenRows.push( { - "nTr": nNewRow, - "nParent": nTr - } ); - - return nNewRow; - }; - - - /** - * Change the pagination - provides the internal logic for pagination in a simple API - * function. With this function you can have a DataTables table go to the next, - * previous, first or last pages. - * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" - * or page number to jump to (integer), note that page 0 is the first page. - * @param {bool} [bRedraw=true] Redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * oTable.fnPageChange( 'next' ); - * } ); - */ - this.fnPageChange = function ( mAction, bRedraw ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - _fnPageChange( oSettings, mAction ); - _fnCalculateEnd( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - _fnDraw( oSettings ); - } - }; - - - /** - * Show a particular column - * @param {int} iCol The column whose display should be changed - * @param {bool} bShow Show (true) or hide (false) the column - * @param {bool} [bRedraw=true] Redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Hide the second column after initialisation - * oTable.fnSetColumnVis( 1, false ); - * } ); - */ - this.fnSetColumnVis = function ( iCol, bShow, bRedraw ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen; - var aoColumns = oSettings.aoColumns; - var aoData = oSettings.aoData; - var nTd, bAppend, iBefore; - - /* No point in doing anything if we are requesting what is already true */ - if ( aoColumns[iCol].bVisible == bShow ) - { - return; - } - - /* Show the column */ - if ( bShow ) - { - var iInsert = 0; - for ( i=0 ; i<iCol ; i++ ) - { - if ( aoColumns[i].bVisible ) - { - iInsert++; - } - } - - /* Need to decide if we should use appendChild or insertBefore */ - bAppend = (iInsert >= _fnVisbleColumns( oSettings )); - - /* Which coloumn should we be inserting before? */ - if ( !bAppend ) - { - for ( i=iCol ; i<aoColumns.length ; i++ ) - { - if ( aoColumns[i].bVisible ) - { - iBefore = i; - break; - } - } - } - - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - if ( bAppend ) - { - aoData[i].nTr.appendChild( - aoData[i]._anHidden[iCol] - ); - } - else - { - aoData[i].nTr.insertBefore( - aoData[i]._anHidden[iCol], - _fnGetTdNodes( oSettings, i )[iBefore] ); - } - } - } - } - else - { - /* Remove a column from display */ - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - nTd = _fnGetTdNodes( oSettings, i )[iCol]; - aoData[i]._anHidden[iCol] = nTd; - nTd.parentNode.removeChild( nTd ); - } - } - } - - /* Clear to set the visible flag */ - aoColumns[iCol].bVisible = bShow; - - /* Redraw the header and footer based on the new column visibility */ - _fnDrawHead( oSettings, oSettings.aoHeader ); - if ( oSettings.nTFoot ) - { - _fnDrawHead( oSettings, oSettings.aoFooter ); - } - - /* If there are any 'open' rows, then we need to alter the colspan for this col change */ - for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ ) - { - oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings ); - } - - /* Do a redraw incase anything depending on the table columns needs it - * (built-in: scrolling) - */ - if ( bRedraw === undefined || bRedraw ) - { - _fnAdjustColumnSizing( oSettings ); - _fnDraw( oSettings ); - } - - _fnSaveState( oSettings ); - }; - - - /** - * Get the settings for a particular table for external manipulation - * @returns {object} DataTables settings object. See - * {@link DataTable.models.oSettings} - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * var oSettings = oTable.fnSettings(); - * - * // Show an example parameter from the settings - * alert( oSettings._iDisplayStart ); - * } ); - */ - this.fnSettings = function() - { - return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - }; - - - /** - * Sort the table by a particular column - * @param {int} iCol the data index to sort on. Note that this will not match the - * 'display index' if you have hidden data entries - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sort immediately with columns 0 and 1 - * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] ); - * } ); - */ - this.fnSort = function( aaSort ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - oSettings.aaSorting = aaSort; - _fnSort( oSettings ); - }; - - - /** - * Attach a sort listener to an element for a given column - * @param {node} nNode the element to attach the sort listener to - * @param {int} iColumn the column that a click on this node will sort on - * @param {function} [fnCallback] callback function when sort is run - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sort on column 1, when 'sorter' is clicked on - * oTable.fnSortListener( document.getElementById('sorter'), 1 ); - * } ); - */ - this.fnSortListener = function( nNode, iColumn, fnCallback ) - { - _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn, - fnCallback ); - }; - - - /** - * Update a table cell or row - this method will accept either a single value to - * update the cell with, an array of values with one element for each column or - * an object in the same format as the original data source. The function is - * self-referencing in order to make the multi column updates easier. - * @param {object|array|string} mData Data to update the cell/row with - * @param {node|int} mRow TR element you want to update or the aoData index - * @param {int} [iColumn] The column to update (not used of mData is an array or object) - * @param {bool} [bRedraw=true] Redraw the table or not - * @param {bool} [bAction=true] Perform predraw actions or not - * @returns {int} 0 on success, 1 on error - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell - * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row - * } ); - */ - this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen, sDisplay; - var iRow = (typeof mRow === 'object') ? - _fnNodeToDataIndex(oSettings, mRow) : mRow; - - if ( oSettings.__fnUpdateDeep === undefined && $.isArray(mData) && typeof mData === 'object' ) - { - /* Array update - update the whole row */ - oSettings.aoData[iRow]._aData = mData.slice(); - - /* Flag to the function that we are recursing */ - oSettings.__fnUpdateDeep = true; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false ); - } - oSettings.__fnUpdateDeep = undefined; - } - else if ( oSettings.__fnUpdateDeep === undefined && mData !== null && typeof mData === 'object' ) - { - /* Object update - update the whole row - assume the developer gets the object right */ - oSettings.aoData[iRow]._aData = $.extend( true, {}, mData ); - - oSettings.__fnUpdateDeep = true; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false ); - } - oSettings.__fnUpdateDeep = undefined; - } - else - { - /* Individual cell update */ - _fnSetCellData( oSettings, iRow, iColumn, mData ); - sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' ); - - var oCol = oSettings.aoColumns[iColumn]; - if ( oCol.fnRender !== null ) - { - sDisplay = _fnRender( oSettings, iRow, iColumn ); - if ( oCol.bUseRendered ) - { - _fnSetCellData( oSettings, iRow, iColumn, sDisplay ); - } - } - - if ( oSettings.aoData[iRow].nTr !== null ) - { - /* Do the actual HTML update */ - _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay; - } - } - - /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw - * will rebuild the search array - however, the redraw might be disabled by the user) - */ - var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay ); - oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings, - _fnGetRowData( oSettings, iRow, 'filter' ) ); - - /* Perform pre-draw actions */ - if ( bAction === undefined || bAction ) - { - _fnAdjustColumnSizing( oSettings ); - } - - /* Redraw the table */ - if ( bRedraw === undefined || bRedraw ) - { - _fnReDraw( oSettings ); - } - return 0; - }; - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, in order - * to ensure compatibility. - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the - * formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the required - * version, or false if this version of DataTales is not suitable - * @method - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * alert( oTable.fnVersionCheck( '1.9.0' ) ); - * } ); - */ - this.fnVersionCheck = DataTable.ext.fnVersionCheck; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publically... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} sFunc API function name - * @returns {function} wrapped function - * @memberof DataTable#oApi - */ - function _fnExternApiFunc (sFunc) - { - return function() { - var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( - Array.prototype.slice.call(arguments) ); - return DataTable.ext.oApi[sFunc].apply( this, aArgs ); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that these - * methods are references to internal functions and are considered to be private. - * If you use these methods, be aware that they are liable to change between versions - * (check the upgrade notes). - * @namespace - */ - this.oApi = { - "_fnExternApiFunc": _fnExternApiFunc, - "_fnInitialise": _fnInitialise, - "_fnInitComplete": _fnInitComplete, - "_fnLanguageCompat": _fnLanguageCompat, - "_fnAddColumn": _fnAddColumn, - "_fnColumnOptions": _fnColumnOptions, - "_fnAddData": _fnAddData, - "_fnCreateTr": _fnCreateTr, - "_fnGatherData": _fnGatherData, - "_fnBuildHead": _fnBuildHead, - "_fnDrawHead": _fnDrawHead, - "_fnDraw": _fnDraw, - "_fnReDraw": _fnReDraw, - "_fnAjaxUpdate": _fnAjaxUpdate, - "_fnAjaxParameters": _fnAjaxParameters, - "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw, - "_fnServerParams": _fnServerParams, - "_fnAddOptionsHtml": _fnAddOptionsHtml, - "_fnFeatureHtmlTable": _fnFeatureHtmlTable, - "_fnScrollDraw": _fnScrollDraw, - "_fnAdjustColumnSizing": _fnAdjustColumnSizing, - "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter, - "_fnFilterComplete": _fnFilterComplete, - "_fnFilterCustom": _fnFilterCustom, - "_fnFilterColumn": _fnFilterColumn, - "_fnFilter": _fnFilter, - "_fnBuildSearchArray": _fnBuildSearchArray, - "_fnBuildSearchRow": _fnBuildSearchRow, - "_fnFilterCreateSearch": _fnFilterCreateSearch, - "_fnDataToSearch": _fnDataToSearch, - "_fnSort": _fnSort, - "_fnSortAttachListener": _fnSortAttachListener, - "_fnSortingClasses": _fnSortingClasses, - "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate, - "_fnPageChange": _fnPageChange, - "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo, - "_fnUpdateInfo": _fnUpdateInfo, - "_fnFeatureHtmlLength": _fnFeatureHtmlLength, - "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing, - "_fnProcessingDisplay": _fnProcessingDisplay, - "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex, - "_fnColumnIndexToVisible": _fnColumnIndexToVisible, - "_fnNodeToDataIndex": _fnNodeToDataIndex, - "_fnVisbleColumns": _fnVisbleColumns, - "_fnCalculateEnd": _fnCalculateEnd, - "_fnConvertToWidth": _fnConvertToWidth, - "_fnCalculateColumnWidths": _fnCalculateColumnWidths, - "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust, - "_fnGetWidestNode": _fnGetWidestNode, - "_fnGetMaxLenString": _fnGetMaxLenString, - "_fnStringToCss": _fnStringToCss, - "_fnDetectType": _fnDetectType, - "_fnSettingsFromNode": _fnSettingsFromNode, - "_fnGetDataMaster": _fnGetDataMaster, - "_fnGetTrNodes": _fnGetTrNodes, - "_fnGetTdNodes": _fnGetTdNodes, - "_fnEscapeRegex": _fnEscapeRegex, - "_fnDeleteIndex": _fnDeleteIndex, - "_fnReOrderIndex": _fnReOrderIndex, - "_fnColumnOrdering": _fnColumnOrdering, - "_fnLog": _fnLog, - "_fnClearTable": _fnClearTable, - "_fnSaveState": _fnSaveState, - "_fnLoadState": _fnLoadState, - "_fnCreateCookie": _fnCreateCookie, - "_fnReadCookie": _fnReadCookie, - "_fnDetectHeader": _fnDetectHeader, - "_fnGetUniqueThs": _fnGetUniqueThs, - "_fnScrollBarWidth": _fnScrollBarWidth, - "_fnApplyToChildren": _fnApplyToChildren, - "_fnMap": _fnMap, - "_fnGetRowData": _fnGetRowData, - "_fnGetCellData": _fnGetCellData, - "_fnSetCellData": _fnSetCellData, - "_fnGetObjectDataFn": _fnGetObjectDataFn, - "_fnSetObjectDataFn": _fnSetObjectDataFn, - "_fnApplyColumnDefs": _fnApplyColumnDefs, - "_fnBindAction": _fnBindAction, - "_fnExtend": _fnExtend, - "_fnCallbackReg": _fnCallbackReg, - "_fnCallbackFire": _fnCallbackFire, - "_fnJsonString": _fnJsonString, - "_fnRender": _fnRender, - "_fnNodeToColumnIndex": _fnNodeToColumnIndex, - "_fnInfoMacros": _fnInfoMacros - }; - - $.extend( DataTable.ext.oApi, this.oApi ); - - for ( var sFunc in DataTable.ext.oApi ) - { - if ( sFunc ) - { - this[sFunc] = _fnExternApiFunc(sFunc); - } - } - - - var _that = this; - return this.each(function() { - - var i=0, iLen, j, jLen, k, kLen; - var sId = this.getAttribute( 'id' ); - var bInitHandedOff = false; - var bUsePassedData = false; - - - /* Sanity check */ - if ( this.nodeName.toLowerCase() != 'table' ) - { - _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+ - "table: "+this.nodeName ); - return; - } - - /* Check to see if we are re-initialising a table */ - for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ ) - { - /* Base check on table node */ - if ( DataTable.settings[i].nTable == this ) - { - if ( oInit === undefined || oInit.bRetrieve ) - { - return DataTable.settings[i].oInstance; - } - else if ( oInit.bDestroy ) - { - DataTable.settings[i].oInstance.fnDestroy(); - break; - } - else - { - _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+ - "To retrieve the DataTables object for this table, pass no arguments or see "+ - "the docs for bRetrieve and bDestroy" ); - return; - } - } - - /* If the element we are initialising has the same ID as a table which was previously - * initialised, but the table nodes don't match (from before) then we destroy the old - * instance by simply deleting it. This is under the assumption that the table has been - * destroyed by other methods. Anyone using non-id selectors will need to do this manually - */ - if ( DataTable.settings[i].sTableId == this.id ) - { - DataTable.settings.splice( i, 1 ); - break; - } - } - - /* Ensure the table has an ID - required for accessibility */ - if ( sId === null || sId === "" ) - { - sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++); - this.id = sId; - } - - /* Create the settings object for this table and set some of the default parameters */ - var oSettings = $.extend( true, {}, DataTable.models.oSettings, { - "nTable": this, - "oApi": _that.oApi, - "oInit": oInit, - "sDestroyWidth": $(this).width(), - "sInstance": sId, - "sTableId": sId - } ); - DataTable.settings.push( oSettings ); - - // Need to add the instance after the instance after the settings object has been added - // to the settings array, so we can self reference the table instance if more than one - oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable(); - - /* Setting up the initialisation object */ - if ( !oInit ) - { - oInit = {}; - } - - // Backwards compatibility, before we apply all the defaults - if ( oInit.oLanguage ) - { - _fnLanguageCompat( oInit.oLanguage ); - } - - oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit ); - - // Map the initialisation options onto the settings object - _fnMap( oSettings.oFeatures, oInit, "bPaginate" ); - _fnMap( oSettings.oFeatures, oInit, "bLengthChange" ); - _fnMap( oSettings.oFeatures, oInit, "bFilter" ); - _fnMap( oSettings.oFeatures, oInit, "bSort" ); - _fnMap( oSettings.oFeatures, oInit, "bInfo" ); - _fnMap( oSettings.oFeatures, oInit, "bProcessing" ); - _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" ); - _fnMap( oSettings.oFeatures, oInit, "bSortClasses" ); - _fnMap( oSettings.oFeatures, oInit, "bServerSide" ); - _fnMap( oSettings.oFeatures, oInit, "bDeferRender" ); - _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" ); - _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" ); - _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" ); - _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" ); - _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" ); - _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" ); - _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" ); - _fnMap( oSettings, oInit, "asStripeClasses" ); - _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy - _fnMap( oSettings, oInit, "fnServerData" ); - _fnMap( oSettings, oInit, "fnFormatNumber" ); - _fnMap( oSettings, oInit, "sServerMethod" ); - _fnMap( oSettings, oInit, "aaSorting" ); - _fnMap( oSettings, oInit, "aaSortingFixed" ); - _fnMap( oSettings, oInit, "aLengthMenu" ); - _fnMap( oSettings, oInit, "sPaginationType" ); - _fnMap( oSettings, oInit, "sAjaxSource" ); - _fnMap( oSettings, oInit, "sAjaxDataProp" ); - _fnMap( oSettings, oInit, "iCookieDuration" ); - _fnMap( oSettings, oInit, "sCookiePrefix" ); - _fnMap( oSettings, oInit, "sDom" ); - _fnMap( oSettings, oInit, "bSortCellsTop" ); - _fnMap( oSettings, oInit, "iTabIndex" ); - _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" ); - _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" ); - _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" ); - _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" ); - _fnMap( oSettings, oInit, "fnCookieCallback" ); - _fnMap( oSettings, oInit, "fnStateLoad" ); - _fnMap( oSettings, oInit, "fnStateSave" ); - _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" ); - - /* Callback functions which are array driven */ - _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' ); - _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' ); - _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' ); - _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' ); - - if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort && - oSettings.oFeatures.bSortClasses ) - { - /* Enable sort classes for server-side processing. Safe to do it here, since server-side - * processing must be enabled by the developer - */ - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' ); - } - else if ( oSettings.oFeatures.bDeferRender ) - { - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' ); - } - - if ( oInit.bJQueryUI ) - { - /* Use the JUI classes object for display. You could clone the oStdClasses object if - * you want to have multiple tables with multiple independent classes - */ - $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses ); - - if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" ) - { - /* Set the DOM to use a layout suitable for jQuery UI's theming */ - oSettings.sDom = '<"H"lfr>t<"F"ip>'; - } - } - else - { - $.extend( oSettings.oClasses, DataTable.ext.oStdClasses ); - } - $(this).addClass( oSettings.oClasses.sTable ); - - /* Calculate the scroll bar width and cache it for use later on */ - if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) - { - oSettings.oScroll.iBarWidth = _fnScrollBarWidth(); - } - - if ( oSettings.iInitDisplayStart === undefined ) - { - /* Display start point, taking into account the save saving */ - oSettings.iInitDisplayStart = oInit.iDisplayStart; - oSettings._iDisplayStart = oInit.iDisplayStart; - } - - /* Must be done after everything which can be overridden by a cookie! */ - if ( oInit.bStateSave ) - { - oSettings.oFeatures.bStateSave = true; - _fnLoadState( oSettings, oInit ); - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' ); - } - - if ( oInit.iDeferLoading !== null ) - { - oSettings.bDeferLoading = true; - var tmp = $.isArray( oInit.iDeferLoading ); - oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading; - oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading; - } - - if ( oInit.aaData !== null ) - { - bUsePassedData = true; - } - - /* Language definitions */ - if ( oInit.oLanguage.sUrl !== "" ) - { - /* Get the language definitions from a file - because this Ajax call makes the language - * get async to the remainder of this function we use bInitHandedOff to indicate that - * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor - */ - oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl; - $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) { - _fnLanguageCompat( json ); - $.extend( true, oSettings.oLanguage, oInit.oLanguage, json ); - _fnInitialise( oSettings ); - } ); - bInitHandedOff = true; - } - else - { - $.extend( true, oSettings.oLanguage, oInit.oLanguage ); - } - - - /* - * Stripes - */ - if ( oInit.asStripeClasses === null ) - { - oSettings.asStripeClasses =[ - oSettings.oClasses.sStripeOdd, - oSettings.oClasses.sStripeEven - ]; - } - - /* Remove row stripe classes if they are already on the table row */ - var bStripeRemove = false; - var anRows = $(this).children('tbody').children('tr'); - for ( i=0, iLen=oSettings.asStripeClasses.length ; i<iLen ; i++ ) - { - if ( anRows.filter(":lt(2)").hasClass( oSettings.asStripeClasses[i]) ) - { - bStripeRemove = true; - break; - } - } - - if ( bStripeRemove ) - { - /* Store the classes which we are about to remove so they can be readded on destroy */ - oSettings.asDestroyStripes = [ '', '' ]; - if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeOdd) ) - { - oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeOdd+" "; - } - if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeEven) ) - { - oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeEven; - } - if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeOdd) ) - { - oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeOdd+" "; - } - if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeEven) ) - { - oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeEven; - } - - anRows.removeClass( oSettings.asStripeClasses.join(' ') ); - } - - - /* - * Columns - * See if we should load columns automatically or use defined ones - */ - var anThs = []; - var aoColumnsInit; - var nThead = this.getElementsByTagName('thead'); - if ( nThead.length !== 0 ) - { - _fnDetectHeader( oSettings.aoHeader, nThead[0] ); - anThs = _fnGetUniqueThs( oSettings ); - } - - /* If not given a column array, generate one with nulls */ - if ( oInit.aoColumns === null ) - { - aoColumnsInit = []; - for ( i=0, iLen=anThs.length ; i<iLen ; i++ ) - { - aoColumnsInit.push( null ); - } - } - else - { - aoColumnsInit = oInit.aoColumns; - } - - /* Add the columns */ - for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ ) - { - /* Short cut - use the loop to check if we have column visibility state to restore */ - if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen ) - { - if ( aoColumnsInit[i] === null ) - { - aoColumnsInit[i] = {}; - } - aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible; - } - - _fnAddColumn( oSettings, anThs ? anThs[i] : null ); - } - - /* Apply the column definitions */ - _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) { - _fnColumnOptions( oSettings, iCol, oDef ); - } ); - - - /* - * Sorting - * Check the aaSorting array - */ - for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ ) - { - if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length ) - { - oSettings.aaSorting[i][0] = 0; - } - var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ]; - - /* Add a default sorting index */ - if ( oSettings.aaSorting[i][2] === undefined ) - { - oSettings.aaSorting[i][2] = 0; - } - - /* If aaSorting is not defined, then we use the first indicator in asSorting */ - if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined ) - { - oSettings.aaSorting[i][1] = oColumn.asSorting[0]; - } - - /* Set the current sorting index based on aoColumns.asSorting */ - for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ ) - { - if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] ) - { - oSettings.aaSorting[i][2] = j; - break; - } - } - } - - /* Do a first pass on the sorting classes (allows any size changes to be taken into - * account, and also will apply sorting disabled classes if disabled - */ - _fnSortingClasses( oSettings ); - - - /* - * Final init - * Cache the header, body and footer as required, creating them if needed - */ - - // Work around for Webkit bug 83867 - store the caption-side before removing from doc - var captions = $(this).children('caption').each( function () { - this._captionSide = $(this).css('caption-side'); - } ); - - var thead = $(this).children('thead'); - if ( thead.length === 0 ) - { - thead = [ document.createElement( 'thead' ) ]; - this.appendChild( thead[0] ); - } - oSettings.nTHead = thead[0]; - - var tbody = $(this).children('tbody'); - if ( tbody.length === 0 ) - { - tbody = [ document.createElement( 'tbody' ) ]; - this.appendChild( tbody[0] ); - } - oSettings.nTBody = tbody[0]; - oSettings.nTBody.setAttribute( "role", "alert" ); - oSettings.nTBody.setAttribute( "aria-live", "polite" ); - oSettings.nTBody.setAttribute( "aria-relevant", "all" ); - - var tfoot = $(this).children('tfoot'); - if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) - { - // If we are a scrolling table, and no footer has been given, then we need to create - // a tfoot element for the caption element to be appended to - tfoot = [ document.createElement( 'tfoot' ) ]; - this.appendChild( tfoot[0] ); - } - - if ( tfoot.length > 0 ) - { - oSettings.nTFoot = tfoot[0]; - _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); - } - - /* Check if there is data passing into the constructor */ - if ( bUsePassedData ) - { - for ( i=0 ; i<oInit.aaData.length ; i++ ) - { - _fnAddData( oSettings, oInit.aaData[ i ] ); - } - } - else - { - /* Grab the data from the page */ - _fnGatherData( oSettings ); - } - - /* Copy the data index array */ - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - /* Initialisation complete - table can be drawn */ - oSettings.bInitialised = true; - - /* Check if we need to initialise the table (it might not have been handed off to the - * language processor) - */ - if ( bInitHandedOff === false ) - { - _fnInitialise( oSettings ); - } - } ); - }; - - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, in order - * to ensure compatibility. - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the - * formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the required - * version, or false if this version of DataTales is not suitable - * @static - * @dtopt API-Static - * - * @example - * alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) ); - */ - DataTable.fnVersionCheck = function( sVersion ) - { - /* This is cheap, but effective */ - var fnZPad = function (Zpad, count) - { - while(Zpad.length < count) { - Zpad += '0'; - } - return Zpad; - }; - var aThis = DataTable.ext.sVersion.split('.'); - var aThat = sVersion.split('.'); - var sThis = '', sThat = ''; - - for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) - { - sThis += fnZPad( aThis[i], 3 ); - sThat += fnZPad( aThat[i], 3 ); - } - - return parseInt(sThis, 10) >= parseInt(sThat, 10); - }; - - - /** - * Check if a TABLE node is a DataTable table already or not. - * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other - * node types can be passed in, but will always return false). - * @returns {boolean} true the table given is a DataTable, or false otherwise - * @static - * @dtopt API-Static - * - * @example - * var ex = document.getElementById('example'); - * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) { - * $(ex).dataTable(); - * } - */ - DataTable.fnIsDataTable = function ( nTable ) - { - var o = DataTable.settings; - - for ( var i=0 ; i<o.length ; i++ ) - { - if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable ) - { - return true; - } - } - - return false; - }; - - - /** - * Get all DataTable tables that have been initialised - optionally you can select to - * get only currently visible tables. - * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or - * visible tables only. - * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables - * @static - * @dtopt API-Static - * - * @example - * var table = $.fn.dataTable.fnTables(true); - * if ( table.length > 0 ) { - * $(table).dataTable().fnAdjustColumnSizing(); - * } - */ - DataTable.fnTables = function ( bVisible ) - { - var out = []; - - jQuery.each( DataTable.settings, function (i, o) { - if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) ) - { - out.push( o.nTable ); - } - } ); - - return out; - }; - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @member - * @type string - * @default Version number - */ - DataTable.version = "1.9.2"; - - /** - * Private data store, containing all of the settings objects that are created for the - * tables on a given page. - * - * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> - * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>. - * @member - * @type array - * @default [] - * @private - */ - DataTable.settings = []; - - /** - * Object models container, for the various models that DataTables has available - * to it. These models define the objects that are used to hold the active state - * and configuration of the table. - * @namespace - */ - DataTable.models = {}; - - - /** - * DataTables extension options and plug-ins. This namespace acts as a collection "area" - * for plug-ins that can be used to extend the default DataTables behaviour - indeed many - * of the build in methods use this method to provide their own capabilities (sorting methods - * for example). - * - * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed - * and modified by plug-ins. - * @namespace - */ - DataTable.models.ext = { - /** - * Plug-in filtering functions - this method of filtering is complimentary to the default - * type based filtering, and a lot more comprehensive as it allows you complete control - * over the filtering logic. Each element in this array is a function (parameters - * described below) that is called for every row in the table, and your logic decides if - * it should be included in the filtered data set or not. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{array|object} Data for the row to be processed (same as the original format - * that was passed in as the data source, or an array from a DOM data source</li> - * <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can - * be useful to retrieve the TR element if you need DOM interaction.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{boolean} Include the row in the filtered result set (true) or not (false)</li> - * </ul> - * </il> - * </ul> - * @type array - * @default [] - * - * @example - * // The following example shows custom filtering being applied to the fourth column (i.e. - * // the aData[3] index) based on two input values from the end-user, matching the data in - * // a certain range. - * $.fn.dataTableExt.afnFiltering.push( - * function( oSettings, aData, iDataIndex ) { - * var iMin = document.getElementById('min').value * 1; - * var iMax = document.getElementById('max').value * 1; - * var iVersion = aData[3] == "-" ? 0 : aData[3]*1; - * if ( iMin == "" && iMax == "" ) { - * return true; - * } - * else if ( iMin == "" && iVersion < iMax ) { - * return true; - * } - * else if ( iMin < iVersion && "" == iMax ) { - * return true; - * } - * else if ( iMin < iVersion && iVersion < iMax ) { - * return true; - * } - * return false; - * } - * ); - */ - "afnFiltering": [], - - - /** - * Plug-in sorting functions - this method of sorting is complimentary to the default type - * based sorting that DataTables does automatically, allowing much greater control over the - * the data that is being used to sort a column. This is useful if you want to do sorting - * based on live data (for example the contents of an 'input' element) rather than just the - * static string that DataTables knows of. The way these plug-ins work is that you create - * an array of the values you wish to be sorted for the column in question and then return - * that array. Which pre-sorting function is run here depends on the sSortDataType parameter - * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort - * data. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{int} Target column index</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{array} Data for the column to be sorted upon</li> - * </ul> - * </il> - * </ul> - * - * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for - * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type array - * @default [] - * @deprecated - * - * @example - * // Updating the cached sorting information with user entered values in HTML input elements - * jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn ) - * { - * var aData = []; - * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () { - * aData.push( this.value ); - * } ); - * return aData; - * } - */ - "afnSortData": [], - - - /** - * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are accessible through the sDom initialisation - * option. As such, each feature plug-in must describe a function that is used to initialise - * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name - * of the feature (sFeature). Thus the objects attached to this method must provide: - * <ul> - * <li>{function} fnInit Initialisation of the plug-in - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{node|null} The element which contains your feature. Note that the return - * may also be void if your plug-in does not require to inject any DOM elements - * into DataTables control (sDom) - for example this might be useful when - * developing a plug-in which allows table control via keyboard entry.</li> - * </ul> - * </il> - * </ul> - * </li> - * <li>{character} cFeature Character that will be matched in sDom - case sensitive</li> - * <li>{string} sFeature Feature name</li> - * </ul> - * @type array - * @default [] - * - * @example - * // How TableTools initialises itself. - * $.fn.dataTableExt.aoFeatures.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T", - * "sFeature": "TableTools" - * } ); - */ - "aoFeatures": [], - - - /** - * Type detection plug-in functions - DataTables utilises types to define how sorting and - * filtering behave, and types can be either be defined by the developer (sType for the - * column) or they can be automatically detected by the methods in this array. The functions - * defined in the array are quite simple, taking a single parameter (the data to analyse) - * and returning the type if it is a known type, or null otherwise. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data from the column cell to be analysed</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{string|null} Data type detected, or null if unknown (and thus pass it - * on to the other type detection functions.</li> - * </ul> - * </il> - * </ul> - * @type array - * @default [] - * - * @example - * // Currency type detection plug-in: - * jQuery.fn.dataTableExt.aTypes.push( - * function ( sData ) { - * var sValidChars = "0123456789.-"; - * var Char; - * - * // Check the numeric part - * for ( i=1 ; i<sData.length ; i++ ) { - * Char = sData.charAt(i); - * if (sValidChars.indexOf(Char) == -1) { - * return null; - * } - * } - * - * // Check prefixed by currency - * if ( sData.charAt(0) == '$' || sData.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - "aTypes": [], - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, - * in order to ensure compatibility. - * @type function - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note - * that the formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the - * required version, or false if this version of DataTales is not suitable - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * alert( oTable.fnVersionCheck( '1.9.0' ) ); - * } ); - */ - "fnVersionCheck": DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @default 0 - */ - "iApiIndex": 0, - - - /** - * Pre-processing of filtering data plug-ins - When you assign the sType for a column - * (or have it automatically detected for you by DataTables or a type detection plug-in), - * you will typically be using this for custom sorting, but it can also be used to provide - * custom filtering by allowing you to pre-processing the data and returning the data in - * the format that should be filtered upon. This is done by adding functions this object - * with a parameter name which matches the sType for that target column. This is the - * corollary of <i>afnSortData</i> for filtering data. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data from the column cell to be prepared for filtering</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{string|null} Formatted string that will be used for the filtering.</li> - * </ul> - * </il> - * </ul> - * - * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for - * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type object - * @default {} - * @deprecated - * - * @example - * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) { - * return sData.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - "ofnSearch": {}, - - - /** - * Container for all private functions in DataTables so they can be exposed externally - * @type object - * @default {} - */ - "oApi": {}, - - - /** - * Storage for the various classes that DataTables uses - * @type object - * @default {} - */ - "oStdClasses": {}, - - - /** - * Storage for the various classes that DataTables uses - jQuery UI suitable - * @type object - * @default {} - */ - "oJUIClasses": {}, - - - /** - * Pagination plug-in methods - The style and controls of the pagination can significantly - * impact on how the end user interacts with the data in your table, and DataTables allows - * the addition of pagination controls by extending this object, which can then be enabled - * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that - * is added is an object (the property name of which is what <i>sPaginationType</i> refers - * to) that has two properties, both methods that are used by DataTables to update the - * control's state. - * <ul> - * <li> - * fnInit - Initialisation of the paging controls. Called only during initialisation - * of the table. It is expected that this function will add the required DOM elements - * to the page for the paging controls to work. The element pointer - * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging - * controls (note that this is a 2D array to allow for multiple instances of each - * DataTables DOM element). It is suggested that you add the controls to this element - * as children - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{node} Container into which the pagination controls must be inserted</li> - * <li>{function} Draw callback function - whenever the controls cause a page - * change, this method must be called to redraw the table.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>No return required</li> - * </ul> - * </il> - * </ul> - * </il> - * <li> - * fnInit - This function is called whenever the paging status of the table changes and is - * typically used to update classes and/or text of the paging controls to reflex the new - * status. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{function} Draw callback function - in case you need to redraw the table again - * or attach new event listeners</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>No return required</li> - * </ul> - * </il> - * </ul> - * </il> - * </ul> - * @type object - * @default {} - * - * @example - * $.fn.dataTableExt.oPagination.four_button = { - * "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { - * nFirst = document.createElement( 'span' ); - * nPrevious = document.createElement( 'span' ); - * nNext = document.createElement( 'span' ); - * nLast = document.createElement( 'span' ); - * - * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) ); - * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) ); - * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) ); - * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) ); - * - * nFirst.className = "paginate_button first"; - * nPrevious.className = "paginate_button previous"; - * nNext.className="paginate_button next"; - * nLast.className = "paginate_button last"; - * - * nPaging.appendChild( nFirst ); - * nPaging.appendChild( nPrevious ); - * nPaging.appendChild( nNext ); - * nPaging.appendChild( nLast ); - * - * $(nFirst).click( function () { - * oSettings.oApi._fnPageChange( oSettings, "first" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nPrevious).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "previous" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nNext).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "next" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nLast).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "last" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nFirst).bind( 'selectstart', function () { return false; } ); - * $(nPrevious).bind( 'selectstart', function () { return false; } ); - * $(nNext).bind( 'selectstart', function () { return false; } ); - * $(nLast).bind( 'selectstart', function () { return false; } ); - * }, - * - * "fnUpdate": function ( oSettings, fnCallbackDraw ) { - * if ( !oSettings.aanFeatures.p ) { - * return; - * } - * - * // Loop over each instance of the pager - * var an = oSettings.aanFeatures.p; - * for ( var i=0, iLen=an.length ; i<iLen ; i++ ) { - * var buttons = an[i].getElementsByTagName('span'); - * if ( oSettings._iDisplayStart === 0 ) { - * buttons[0].className = "paginate_disabled_previous"; - * buttons[1].className = "paginate_disabled_previous"; - * } - * else { - * buttons[0].className = "paginate_enabled_previous"; - * buttons[1].className = "paginate_enabled_previous"; - * } - * - * if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) { - * buttons[2].className = "paginate_disabled_next"; - * buttons[3].className = "paginate_disabled_next"; - * } - * else { - * buttons[2].className = "paginate_enabled_next"; - * buttons[3].className = "paginate_enabled_next"; - * } - * } - * } - * }; - */ - "oPagination": {}, - - - /** - * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the - * data column (you can add your own type detection functions, or override automatic - * detection using sType). With this specific type given to the column, DataTables will - * apply the required sort from the functions in the object. Each sort type must provide - * two mandatory methods, one each for ascending and descending sorting, and can optionally - * provide a pre-formatting method that will help speed up sorting by allowing DataTables - * to pre-format the sort data only once (rather than every time the actual sort functions - * are run). The two sorting functions are typical Javascript sort methods: - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data to compare to the second parameter</li> - * <li>{*} Data to compare to the first parameter</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{int} Sorting match: <0 if first parameter should be sorted lower than - * the second parameter, ===0 if the two parameters are equal and >0 if - * the first parameter should be sorted height than the second parameter.</li> - * </ul> - * </il> - * </ul> - * @type object - * @default {} - * - * @example - * // Case-sensitive string sorting, with no pre-formatting method - * $.extend( $.fn.dataTableExt.oSort, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - * - * @example - * // Case-insensitive string sorting, with pre-formatting - * $.extend( $.fn.dataTableExt.oSort, { - * "string-pre": function(x) { - * return x.toLowerCase(); - * }, - * "string-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - "oSort": {}, - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @type string - * @default Version number - */ - "sVersion": DataTable.version, - - - /** - * How should DataTables report an error. Can take the value 'alert' or 'throw' - * @type string - * @default alert - */ - "sErrMode": "alert", - - - /** - * Store information for DataTables to access globally about other instances - * @namespace - * @private - */ - "_oExternConfig": { - /* int:iNextUnique - next unique number for an instance */ - "iNextUnique": 0 - } - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * search information for the global filter and individual column filters. - * @namespace - */ - DataTable.models.oSearch = { - /** - * Flag to indicate if the filtering should be case insensitive or not - * @type boolean - * @default true - */ - "bCaseInsensitive": true, - - /** - * Applied search term - * @type string - * @default <i>Empty string</i> - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mDataProp options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default [] - * @private - */ - "_aSortData": [], - - /** - * Array of TD elements that are cached for hidden rows, so they can be - * reinserted into the table if a column is made visible again (or to act - * as a store if a column is made hidden). Only hidden columns have a - * reference in the array. For non-hidden columns the value is either - * undefined or null. - * @type array nodes - * @default [] - * @private - */ - "_anHidden": [], - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default <i>Empty string</i> - * @private - */ - "_sRowStripe": "" - }; - - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.columns} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * When using fnRender, you have two options for what to do with the data, - * and this property serves as the switch. Firstly, you can have the sorting - * and filtering use the rendered value (true - default), or you can have - * the sorting and filtering us the original value (false). - * - * *NOTE* It is it is advisable now to use mDataProp as a function and make - * use of the 'type' that it gives, allowing (potentially) different data to - * be used for sorting, filtering, display and type detection. - * @type boolean - * @deprecated - */ - "bUseRendered": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Flag to indicate to the type detection method if the automatic type - * detection should be used, or if a column type (sType) has been specified - * @type boolean - * @default true - * @private - */ - "_bAutoType": true, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to fnRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available (since it is not when fnRender is called). - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should <b>never</b> - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mDataProp to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Custom display function that will be called for the display of each cell - * in this column. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @returns {string} The string you which to use in the display - * @default null - */ - "fnRender": null, - - /** - * Function to set data for a cell in the column. You should <b>never</b> - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mDataProp to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mDataProp": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mDataProp - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * @dtopt Option - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "aoColumns": [ - * { "sTitle": "Engine" }, - * { "sTitle": "Browser" }, - * { "sTitle": "Platform" }, - * { "sTitle": "Version" }, - * { "sTitle": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (mDataProp) - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "aoColumns": [ - * { "sTitle": "Engine", "mDataProp": "engine" }, - * { "sTitle": "Browser", "mDataProp": "browser" }, - * { "sTitle": "Platform", "mDataProp": "platform" }, - * { "sTitle": "Version", "mDataProp": "version" }, - * { "sTitle": "Grade", "mDataProp": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If sorting is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed upon, - * and the sorting direction, with this variable. The aaSorting array should - * contain an array for each column to be sorted initially containing the - * column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * @dtopt Option - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [] - * } ); - * } ); - */ - "aaSorting": [[0,'asc']], - - - /** - * This parameter is basically identical to the aaSorting parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting will - * always be forced on first - any sorting after that (from the user) will - * then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSortingFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * @type array - * @default [ 10, 25, 50, 100 ] - * @dtopt Option - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - * - * @example - * // Setting the default display length as well as length menu - * // This is likely to be wanted if you remove the '10' option which - * // is the iDisplayLength default. - * $(document).ready(function() { - * $('#example').dataTable( { - * "iDisplayLength": 25, - * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [ 10, 25, 50, 100 ], - - - /** - * The aoColumns option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.columns}. Note that if you use aoColumns to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - */ - "aoColumns": null, - - /** - * Very similar to aoColumns, aoColumnDefs allows you to target a specific - * column, multiple columns, or all columns, using the aTargets property of - * each object in the array. This allows great flexibility when creating - * tables, as the aoColumnDefs arrays can be of any length, targeting the - * columns you specifically want. aoColumnDefs may use any of the column - * options available: {@link DataTable.defaults.columns}, but it _must_ - * have aTargets defined in each object in the array. Values in the aTargets - * array may be: - * <ul> - * <li>a string - class name will be matched on the TH for the column</li> - * <li>0 or a positive integer - column index counting from the left</li> - * <li>a negative integer - column index counting from the right</li> - * <li>the string "_all" - all columns (i.e. assign a default)</li> - * </ul> - * @member - */ - "aoColumnDefs": null, - - - /** - * Basically the same as oSearch, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoSearchCols": [ - * null, - * { "sSearch": "My filter" }, - * null, - * { "sSearch": "^[0-9]", "bEscapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null <i>Will take the values determinted by the oClasses.sStripe* - * options</i> - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using aoColumns. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bAutoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/arrays.txt", - * "bDeferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "bFilter": false, - * "bDestroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.sDom}. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bFilter": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bInfo": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some - * slightly different and additional mark-up from what DataTables has - * traditionally used). - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bJQueryUI": true - * } ); - * } ); - */ - "bJQueryUI": false, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate). - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bLengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bPaginate": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bProcessing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). bDestroy can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false, - * "bRetrieve": true - * } ); - * } - * - * function tableActions () - * { - * var oTable = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * @type boolean - * @default true - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollAutoCss": false, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollAutoCss": true, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200", - * "bScrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Enable infinite scrolling for DataTables (to be used in combination with - * sScrollY). Infinite scrolling means that DataTables will continually load - * data as a user scrolls through a table, which is very useful for large - * dataset. This cannot be used with pagination, which is automatically - * disabled. Note - the Scroller extra for DataTables is recommended in - * in preference to this option. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollInfinite": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * sAjaxSource parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * @dtopt Features - * @dtopt Server-side - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the "bSortable" option for each column. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSort": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bSortCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and - * 'sorting_3' to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSortClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled a cookie will be used to save - * table display information such as pagination information, display length, - * filtering and sorting. As such when the end user reloads the page the - * display display will match what thy had previously set up. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bStateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * Customise the cookie and / or the parameters being stored when using - * DataTables with state saving enabled. This function is called whenever - * the cookie is modified, and it expects a fully formed cookie string to be - * returned. Note that the data object passed in is a Javascript object which - * must be converted to a string (JSON.stringify for example). - * @type function - * @param {string} sName Name of the cookie defined by DataTables - * @param {object} oData Data to be stored in the cookie - * @param {string} sExpires Cookie expires string - * @param {string} sPath Path of the cookie to set - * @returns {string} Cookie formatted string (which should be encoded by - * using encodeURIComponent()) - * @dtopt Callbacks - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "fnCookieCallback": function (sName, oData, sExpires, sPath) { - * // Customise oData or sName or whatever else here - * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath; - * } - * } ); - * } ); - */ - "fnCookieCallback": null, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} nRow "TR" element for the current row - * @param {array} aData Raw data array for this row - * @param {int} iDataIndex The index of this row in aoData - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnCreatedRow": function( nRow, aData, iDataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( aData[4] == "A" ) - * { - * $('td:eq(4)', nRow).html( '<b>A</b>' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnDrawCallback": function( oSettings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' even. - * @type function - * @param {node} nFoot "TR" element for the footer - * @param {array} aData Full table data (as derived from the original HTML) - * @param {int} iStart Index for the current display starting point in the - * display array - * @param {int} iEnd Index for the current display ending point in the - * display array - * @param {array int} aiDisplay Index array to translate the visual position - * to the full data array - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) { - * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} iIn number to be formatted - * @returns {string} formatted string for DataTables to show the number - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnFormatNumber": function ( iIn ) { - * if ( iIn < 1000 ) { - * return iIn; - * } else { - * var - * s=(iIn+""), - * a=s.split(""), out="", - * iLen=s.length; - * - * for ( var i=0 ; i<iLen ; i++ ) { - * if ( i%3 === 0 && i !== 0 ) { - * out = "'"+out; - * } - * out = a[iLen-i-1]+out; - * } - * } - * return out; - * }; - * } ); - * } ); - */ - "fnFormatNumber": function ( iIn ) { - if ( iIn < 1000 ) - { - // A small optimisation for what is likely to be the majority of use cases - return iIn; - } - - var s=(iIn+""), a=s.split(""), out="", iLen=s.length; - - for ( var i=0 ; i<iLen ; i++ ) - { - if ( i%3 === 0 && i !== 0 ) - { - out = this.oLanguage.sInfoThousands+out; - } - out = a[iLen-i-1]+out; - } - return out; - }, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify the header row. This can be used to calculate and - * display useful information about the table. - * @type function - * @param {node} nHead "TR" element for the header - * @param {array} aData Full table data (as derived from the original HTML) - * @param {int} iStart Index for the current display starting point in the - * display array - * @param {int} iEnd Index for the current display ending point in the - * display array - * @param {array int} aiDisplay Index array to translate the visual position - * to the full data array - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) { - * nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records"; - * } - * } ); - * } ) - */ - "fnHeaderCallback": null, - - - /** - * The information element can be used to convey information about the current - * state of the table. Although the internationalisation options presented by - * DataTables are quite capable of dealing with most customisations, there may - * be times where you wish to customise the string further. This callback - * allows you to do exactly that. - * @type function - * @param {object} oSettings DataTables settings object - * @param {int} iStart Starting position in data for the draw - * @param {int} iEnd End position in data for the draw - * @param {int} iMax Total number of rows in the table (regardless of - * filtering) - * @param {int} iTotal Total number of rows in the data set, after filtering - * @param {string} sPre The string that DataTables has formatted using it's - * own rules - * @returns {string} The string to be displayed in the information element. - * @dtopt Callbacks - * - * @example - * $('#example').dataTable( { - * "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) { - * return iStart +" to "+ iEnd; - * } - * } ); - */ - "fnInfoCallback": null, - - - /** - * Called when the table has been initialised. Normally DataTables will - * initialise sequentially and there will be no need for this function, - * however, this does not hold true when using external language information - * since that is obtained using an async XHR call. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnInitComplete": function(oSettings, json) { - * alert( 'DataTables has finished its initialisation.' ); - * } - * } ); - * } ) - */ - "fnInitComplete": null, - - - /** - * Called at the very start of each table draw and can be used to cancel the - * draw by returning false, any other return (including undefined) results in - * the full draw occurring). - * @type function - * @param {object} oSettings DataTables settings object - * @returns {boolean} False will cancel the draw, anything else (including no - * return) will allow it to complete. - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnPreDrawCallback": function( oSettings ) { - * if ( $('#test').val() == 1 ) { - * return false; - * } - * } - * } ); - * } ); - */ - "fnPreDrawCallback": null, - - - /** - * This function allows you to 'post process' each row after it have been - * generated for each table draw, but before it is rendered on screen. This - * function might be used for setting the row class name etc. - * @type function - * @param {node} nRow "TR" element for the current row - * @param {array} aData Raw data array for this row - * @param {int} iDisplayIndex The display index for the current table draw - * @param {int} iDisplayIndexFull The index of the data in the full list of - * rows (after filtering) - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { - * // Bold the grade for all 'A' grade browsers - * if ( aData[4] == "A" ) - * { - * $('td:eq(4)', nRow).html( '<b>A</b>' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * This parameter allows you to override the default function which obtains - * the data from the server ($.getJSON) so something more suitable for your - * application. For example you could use POST data, or pull information from - * a Gears or AIR database. - * @type function - * @member - * @param {string} sSource HTTP source to obtain the data from (sAjaxSource) - * @param {array} aoData A key/value pair object containing the data to send - * to the server - * @param {function} fnCallback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * // POST data to server - * $(document).ready(function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "xhr.php", - * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) { - * oSettings.jqXHR = $.ajax( { - * "dataType": 'json', - * "type": "POST", - * "url": sSource, - * "data": aoData, - * "success": fnCallback - * } ); - * } - * } ); - * } ); - */ - "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) { - oSettings.jqXHR = $.ajax( { - "url": sUrl, - "data": aoData, - "success": function (json) { - $(oSettings.oInstance).trigger('xhr', oSettings); - fnCallback( json ); - }, - "dataType": "json", - "cache": false, - "type": oSettings.sServerMethod, - "error": function (xhr, error, thrown) { - if ( error == "parsererror" ) { - oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+ - "server could not be parsed. This is caused by a JSON formatting error." ); - } - } - } ); - }, - - - /** - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} aoData Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the aoData array passed in, - * as this is passed by reference. - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "fnServerParams": function ( aoData ) { - * aoData.push( { "name": "more_data", "value": "my_value" } ); - * } - * } ); - * } ); - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from its state saving - * cookie, but you might wish to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @return {object} The DataTables state object to be loaded - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoad": function (oSettings) { - * var o; - * - * // Send an Ajax request to the server to get the data. Note that - * // this is a synchronous request. - * $.ajax( { - * "url": "/state_load", - * "async": false, - * "dataType": "json", - * "success": function (json) { - * o = json; - * } - * } ); - * - * return o; - * } - * } ); - * } ); - */ - "fnStateLoad": function ( oSettings ) { - var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance ); - var oData; - - try { - oData = (typeof $.parseJSON === 'function') ? - $.parseJSON(sData) : eval( '('+sData+')' ); - } catch (e) { - oData = null; - } - - return oData; - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the 'stateLoadParams' event to load parameters for - * a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that is to be loaded - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * return false; - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that was loaded - * @dtopt Callbacks - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoaded": function (oSettings, oData) { - * alert( 'Saved filter was: '+oData.oSearch.sSearch ); - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored - by default it will use a cookie, but you - * might want to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSave": function (oSettings, oData) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": oData, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSave": function ( oSettings, oData ) { - this.oApi._fnCreateCookie( - oSettings.sCookiePrefix+oSettings.sInstance, - this.oApi._fnJsonString(oData), - oSettings.iCookieDuration, - oSettings.sCookiePrefix, - oSettings.fnCookieCallback - ); - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the 'stateSaveParams' event to save parameters for a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSaveParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration of the cookie which is used for storing session information. This - * value is given in seconds. - * @type int - * @default 7200 <i>(2 hours)</i> - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iCookieDuration": 60*60*24 // 1 day - * } ); - * } ) - */ - "iCookieDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. iDeferLoading - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * @dtopt Options - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": [ 57, 100 ], - * "oSearch": { - * "sSearch": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (bLengthChange) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * The scroll gap is the amount of scrolling that is left to go before - * DataTables will load the next 'page' of data automatically. You typically - * want a gap which is big enough that the scrolling will be smooth for the - * user, while not so large that it will load more data than need. - * @type int - * @default 100 - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px", - * "iScrollLoadGap": 50 - * } ); - * } ); - */ - "iScrollLoadGap": 100, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a tabindex attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "iTabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the two built-in pagination - * control types ("two_button" and "full_numbers") - * @namespace - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sFirst": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sLast": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the next page. - * @type string - * @default Next - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sNext": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the previous page. - * @type string - * @default Previous - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sPrevious": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to sZeroRecords when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of sZeroRecords will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sEmptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information that - * is current on display on the page. The _START_, _END_ and _TOTAL_ - * variables are all dynamically replaced as the table display updates, and - * can be freely moved or removed as the language requirements change. - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match sInfo. - * @type string - * @default Showing 0 to 0 of 0 entries - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (sInfo) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are - * being used) at all times. - * @type string - * @default <i>Empty string</i> - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * DataTables has a build in number formatter (fnFormatNumber) which is used - * to format large numbers that are used in the table information. By - * default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoThousands": "'" - * } - * } ); - * } ); - */ - "sInfoThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * @dtopt Language - * - * @example - * // Language change only - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": 'Display <select>'+ - * '<option value="10">10</option>'+ - * '<option value="20">20</option>'+ - * '<option value="30">30</option>'+ - * '<option value="40">40</option>'+ - * '<option value="50">50</option>'+ - * '<option value="-1">All</option>'+ - * '</select> records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLoadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sProcessing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * @dtopt Language - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default <i>Empty string - i.e. disabled</i> - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. sEmptyTable is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sZeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the "sSearch" parameter must be - * defined, but all other parameters are optional. When "bRegex" is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When "bSmart" - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oSearch": {"sSearch": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * By default DataTables will look for the property 'aaData' when obtaining - * data from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted object - * notation to get a data source for multiple levels of nesting. - * @type string - * @default aaData - * @dtopt Options - * @dtopt Server-side - * - * @example - * // Get data from { "data": [...] } - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data" - * } ); - * } ); - * - * @example - * // Get data from { "data": { "inner": [...] } } - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data.inner" - * } ); - * } ); - */ - "sAjaxDataProp": "aaData", - - - /** - * You can instruct DataTables to load data from an external source using this - * parameter (use aData if you want to pass data in you already have). Simply - * provide a url a JSON object can be obtained from. This object must include - * the parameter 'aaData' which is the data source for the table. - * @type string - * @default null - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php" - * } ); - * } ) - */ - "sAjaxSource": null, - - - /** - * This parameter can be used to override the default prefix that DataTables - * assigns to a cookie when state saving is enabled. - * @type string - * @default SpryMedia_DataTables_ - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sCookiePrefix": "my_datatable_", - * } ); - * } ); - */ - "sCookiePrefix": "SpryMedia_DataTables_", - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - * <ul> - * <li>The following options are allowed: - * <ul> - * <li>'l' - Length changing</li - * <li>'f' - Filtering input</li> - * <li>'t' - The table!</li> - * <li>'i' - Information</li> - * <li>'p' - Pagination</li> - * <li>'r' - pRocessing</li> - * </ul> - * </li> - * <li>The following constants are allowed: - * <ul> - * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li> - * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li> - * </ul> - * </li> - * <li>The following syntax is expected: - * <ul> - * <li>'<' and '>' - div elements</li> - * <li>'<"class" and '>' - div with a class</li> - * <li>'<"#id" and '>' - div with an ID</li> - * </ul> - * </li> - * <li>Examples: - * <ul> - * <li>'<"wrapper"flipt>'</li> - * <li>'<lf<t>ip>'</li> - * </ul> - * </li> - * </ul> - * @type string - * @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> - * <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i> - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sDom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * DataTables features two different built-in pagination interaction methods - * ('two_button' or 'full_numbers') which present different page controls to - * the end user. Further methods can be added using the API (see below). - * @type string - * @default two_button - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sPaginationType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "two_button", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a certain - * layout, or you have a large number of columns in the table, you can enable - * x-scrolling to show the table in a viewport, which can be scrolled. This - * property can be any CSS unit, or a number (in which case it will be treated - * as a pixel measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "bScrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "sScrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/post.php", - * "sServerMethod": "POST" - * } ); - * } ); - */ - "sServerMethod": "GET" - }; - - - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.columns = { - /** - * Allows a column's sorting to take multiple columns into account when - * doing a sort. For example first name / last name columns make sense to - * do a multi-column sort over the two columns. - * @type array - * @default null <i>Takes the value of the column index automatically</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] }, - * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] }, - * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "aDataSort": [ 0, 1 ] }, - * { "aDataSort": [ 1, 0 ] }, - * { "aDataSort": [ 2, 3, 4 ] }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - - - /** - * You can control the default sorting direction, and even alter the behaviour - * of the sort handler (i.e. only allow ascending sorting etc) using this - * parameter. - * @type array - * @default [ 'asc', 'desc' ] - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "asSorting": [ "asc" ], "aTargets": [ 1 ] }, - * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] }, - * { "asSorting": [ "desc" ], "aTargets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * { "asSorting": [ "asc" ] }, - * { "asSorting": [ "desc", "asc", "asc" ] }, - * { "asSorting": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSearchable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSearchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable sorting on this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSortable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSortable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * When using fnRender() for a column, you may wish to use the original data - * (before rendering) for sorting and filtering (the default is to used the - * rendered data that the user can see). This may be useful for dates etc. - * - * *NOTE* It is it is advisable now to use mDataProp as a function and make - * use of the 'type' that it gives, allowing (potentially) different data to - * be used for sorting, filtering, display and type detection. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "fnRender": function ( oObj ) { - * return oObj.aData[0] +' '+ oObj.aData[3]; - * }, - * "bUseRendered": false, - * "aTargets": [ 0 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { - * "fnRender": function ( oObj ) { - * return oObj.aData[0] +' '+ oObj.aData[3]; - * }, - * "bUseRendered": false - * }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "bUseRendered": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bVisible": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bVisible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to fnRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available (since it is not when fnRender is called). - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @param {int} iCol The column index for aoColumns - * @dtopt Columns - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ { - * "aTargets": [3], - * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { - * if ( sData == "1.7" ) { - * $(nTd).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * Custom display function that will be called for the display of each cell in - * this column. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @param {object} o.mDataProp The data property used for this column - * @param {*} val The current cell value - * @returns {string} The string you which to use in the display - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "fnRender": function ( o, val ) { - * return o.aData[0] +' '+ o.aData[3]; - * }, - * "aTargets": [ 0 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "fnRender": function ( o, val ) { - * return o.aData[0] +' '+ o.aData[3]; - * } }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "fnRender": null, - - - /** - * The column index (starting from 0!) that you wish a sort to be performed - * upon when this column is selected for sorting. This can be used for sorting - * on hidden columns for example. - * @type int - * @default -1 <i>Use automatically calculated column index</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "iDataSort": 1, "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "iDataSort": 1 }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "iDataSort": -1, - - - /** - * This property can be used to read data from any JSON data source property, - * including deeply nested objects / properties. mDataProp can be given in a - * number of different ways which effect its behaviour: - * <ul> - * <li>integer - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column).</li> - * <li>string - read an object property from the data source. Note that you can - * use Javascript dotted notation to read deep properties/arrays from the - * data source.</li> - * <li>null - the sDefaultContent option will be used for the cell (null - * by default, so you will need to specify the default content you want - - * typically an empty string). This can be useful on generated columns such - * as edit / delete action columns.</li> - * <li>function - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * <ul> - * <li>{array|object} The data source for the row</li> - * <li>{string} The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined when - * gathering data. Note that when <i>undefined</i> is given for the type - * DataTables expects to get the raw data for the object back</li> - * <li>{*} Data to set when the second parameter is 'set'.</li> - * </ul> - * The return value from the function is not required when 'set' is the type - * of call, but otherwise the return is what will be used for the data - * requested.</li> - * </ul> - * @type string|int|function|null - * @default null <i>Use automatically calculated column index</i> - * @dtopt Columns - * - * @example - * // Read table data from objects - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/deep.txt", - * "aoColumns": [ - * { "mDataProp": "engine" }, - * { "mDataProp": "browser" }, - * { "mDataProp": "platform.inner" }, - * { "mDataProp": "platform.details.0" }, - * { "mDataProp": "platform.details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using mDataProp as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "aTargets": [ 0 ], - * "mDataProp": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * ] - * } ); - * } ); - */ - "mDataProp": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "aTargets": [ 0 ], - * "sCellType": "th" - * ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default <i>Empty string</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sClass": "my_class", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sClass": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this, and it is not documented on the - * general DataTables.net documentation - * @type string - * @default <i>Empty string<i> - * @dtopt Columns - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "sContentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mDataProp - * is set to null, or because the data source itself is null). - * @type string - * @default null - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "mDataProp": null, - * "sDefaultContent": "Edit", - * "aTargets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "mDataProp": null, - * "sDefaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default <i>Empty string</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sName": "engine", "aTargets": [ 0 ] }, - * { "sName": "browser", "aTargets": [ 1 ] }, - * { "sName": "platform", "aTargets": [ 2 ] }, - * { "sName": "version", "aTargets": [ 3 ] }, - * { "sName": "grade", "aTargets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sName": "engine" }, - * { "sName": "browser" }, - * { "sName": "platform" }, - * { "sName": "version" }, - * { "sName": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the sorting which can be used to read - * realtime information from the table (updating the internally cached - * version) prior to sorting. This allows sorting to occur on user editable - * elements such as form inputs. - * @type string - * @default std - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] }, - * { "sType": "numeric", "aTargets": [ 3 ] }, - * { "sSortDataType": "dom-select", "aTargets": [ 4 ] }, - * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * { "sSortDataType": "dom-text" }, - * { "sSortDataType": "dom-text", "sType": "numeric" }, - * { "sSortDataType": "dom-select" }, - * { "sSortDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null <i>Derived from the 'TH' value for this column in the - * original HTML table.</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sTitle": "My column title", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sTitle": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be sorted. - * Four types (string, numeric, date and html (which will strip HTML tags - * before sorting)) are currently available. Note that only date formats - * understood by Javascript's Date() object will be accepted as type date. For - * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric', - * 'date' or 'html' (by default). Further types can be adding through - * plug-ins. - * @type string - * @default null <i>Auto-detected from raw data</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sType": "html", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sType": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applys 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null <i>Automatic</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sWidth": "20%", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sWidth": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoCss": null, - - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Infinite scrolling enablement flag. Now deprecated in favour of - * using the Scroller plug-in. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfinite": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Space (in pixels) between the bottom of the scrolling container and - * the bottom of the scrolling viewport before the next page is loaded - * when using infinite scrolling. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - */ - "iLoadGap": null, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default - */ - "fnInfoCallback": null - }, - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - * <ul> - * <li>'l' - Length changing</li> - * <li>'f' - Filtering input</li> - * <li>'t' - The table!</li> - * <li>'i' - Information</li> - * <li>'p' - Pagination</li> - * <li>'r' - pRocessing</li> - * </ul> - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Search data array for regular expression searching - * @type array - * @default [] - */ - "asDataSearch": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - * <ul> - * <li>Index 0 - column number</li> - * <li>Index 1 - current sorting direction</li> - * <li>Index 2 - index of asSorting for this column</li> - * </ul> - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array|null - * @default null - */ - "aaSortingFixed": null, - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default <i>Empty string</i> - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The cookie duration (for bStateSave) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iCookieDuration": 0, - - /** - * The cookie name prefix. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default <i>Empty string</i> - */ - "sCookiePrefix": "", - - /** - * Callback function for cookie creation. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - * @default null - */ - "fnCookieCallback": null, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - * <ul> - * <li>function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')</li> - * <li>string:sName - name of callback</li> - * </ul> - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - * <ul> - * <li>function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading</li> - * <li>string:sName - name of callback</li> - * </ul> - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was loaded from the cookie. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Paging end point - aiDisplay index. Use fnDisplayEnd rather than - * this property to get the end point - * @type int - * @default 10 - * @private - */ - "_iDisplayEnd": 10, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * Flag to indicate if jQuery UI marking and classes should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bJUI": null, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsTotal, 10); - } else { - return this.aiDisplayMaster.length; - } - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsDisplay, 10); - } else { - return this.aiDisplay.length; - } - }, - - /** - * Set the display end point - aiDisplay index - * @type function - * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here - */ - "fnDisplayEnd": function () - { - if ( this.oFeatures.bServerSide ) { - if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) { - return this._iDisplayStart+this.aiDisplay.length; - } else { - return Math.min( this._iDisplayStart+this._iDisplayLength, - this._iRecordsDisplay ); - } - } else { - return this._iDisplayEnd; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null - }; - - /** - * Extension object for DataTables that is used to provide all extension options. - * - * Note that the <i>DataTable.ext</i> object is available through - * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is - * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - DataTable.ext = $.extend( true, {}, DataTable.models.ext ); - - $.extend( DataTable.ext.oStdClasses, { - "sTable": "dataTable", - - /* Two buttons buttons */ - "sPagePrevEnabled": "paginate_enabled_previous", - "sPagePrevDisabled": "paginate_disabled_previous", - "sPageNextEnabled": "paginate_enabled_next", - "sPageNextDisabled": "paginate_disabled_next", - "sPageJUINext": "", - "sPageJUIPrev": "", - - /* Full numbers paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "paginate_active", - "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled", - "sPageFirst": "first", - "sPagePrevious": "previous", - "sPageNext": "next", - "sPageLast": "last", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sFooterTH": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, { - /* Two buttons buttons */ - "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left", - "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled", - "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right", - "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled", - "sPageJUINext": "ui-icon ui-icon-circle-arrow-e", - "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w", - - /* Full numbers paging buttons */ - "sPageButton": "fg-button ui-button ui-state-default", - "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageFirst": "first ui-corner-tl ui-corner-bl", - "sPageLast": "last ui-corner-tr ui-corner-br", - - /* Features */ - "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ - "ui-buttonset-multi paging_", /* Note that the type is postfixed */ - - /* Sorting */ - "sSortAsc": "ui-state-default", - "sSortDesc": "ui-state-default", - "sSortable": "ui-state-default", - "sSortableAsc": "ui-state-default", - "sSortableDesc": "ui-state-default", - "sSortableNone": "ui-state-default", - "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n", - "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s", - "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s", - "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n", - "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s", - "sSortJUIWrapper": "DataTables_sort_wrapper", - "sSortIcon": "DataTables_sort_icon", - - /* Scrolling */ - "sScrollHead": "dataTables_scrollHead ui-state-default", - "sScrollFoot": "dataTables_scrollFoot ui-state-default", - - /* Misc */ - "sFooterTH": "ui-state-default", - "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix", - "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix" - } ); - - - /* - * Variable: oPagination - * Purpose: - * Scope: jQuery.fn.dataTableExt - */ - $.extend( DataTable.ext.oPagination, { - /* - * Variable: two_button - * Purpose: Standard two button (forward/back) pagination - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "two_button": { - /* - * Function: oPagination.two_button.fnInit - * Purpose: Initialise dom elements required for pagination with forward/back buttons only - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * node:nPaging - the DIV which contains this pagination control - * function:fnCallbackDraw - draw function which must be called on update - */ - "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) - { - var oLang = oSettings.oLanguage.oPaginate; - var oClasses = oSettings.oClasses; - var fnClickHandler = function ( e ) { - if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) - { - fnCallbackDraw( oSettings ); - } - }; - - var sAppend = (!oSettings.bJUI) ? - '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+ - '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>' - : - '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+ - '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>'; - $(nPaging).append( sAppend ); - - var els = $('a', nPaging); - var nPrevious = els[0], - nNext = els[1]; - - oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nPrevious.id = oSettings.sTableId+'_previous'; - nNext.id = oSettings.sTableId+'_next'; - - nPrevious.setAttribute('aria-controls', oSettings.sTableId); - nNext.setAttribute('aria-controls', oSettings.sTableId); - } - }, - - /* - * Function: oPagination.two_button.fnUpdate - * Purpose: Update the two button pagination at the end of the draw - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var oClasses = oSettings.oClasses; - var an = oSettings.aanFeatures.p; - - /* Loop over each instance of the pager */ - for ( var i=0, iLen=an.length ; i<iLen ; i++ ) - { - if ( an[i].childNodes.length !== 0 ) - { - an[i].childNodes[0].className = ( oSettings._iDisplayStart === 0 ) ? - oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled; - - an[i].childNodes[1].className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? - oClasses.sPageNextDisabled : oClasses.sPageNextEnabled; - } - } - } - }, - - - /* - * Variable: iFullNumbersShowPages - * Purpose: Change the number of pages which can be seen - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "iFullNumbersShowPages": 5, - - /* - * Variable: full_numbers - * Purpose: Full numbers pagination - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "full_numbers": { - /* - * Function: oPagination.full_numbers.fnInit - * Purpose: Initialise dom elements required for pagination with a list of the pages - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * node:nPaging - the DIV which contains this pagination control - * function:fnCallbackDraw - draw function which must be called on update - */ - "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) - { - var oLang = oSettings.oLanguage.oPaginate; - var oClasses = oSettings.oClasses; - var fnClickHandler = function ( e ) { - if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) - { - fnCallbackDraw( oSettings ); - } - }; - - $(nPaging).append( - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+ - '<span></span>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>' - ); - var els = $('a', nPaging); - var nFirst = els[0], - nPrev = els[1], - nNext = els[2], - nLast = els[3]; - - oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nFirst.id =oSettings.sTableId+'_first'; - nPrev.id =oSettings.sTableId+'_previous'; - nNext.id =oSettings.sTableId+'_next'; - nLast.id =oSettings.sTableId+'_last'; - } - }, - - /* - * Function: oPagination.full_numbers.fnUpdate - * Purpose: Update the list of page buttons shows - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages; - var iPageCountHalf = Math.floor(iPageCount / 2); - var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); - var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; - var sList = ""; - var iStartButton, iEndButton, i, iLen; - var oClasses = oSettings.oClasses; - var anButtons, anStatic, nPaginateList; - var an = oSettings.aanFeatures.p; - var fnBind = function (j) { - oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) { - /* Use the information in the element to jump to the required page */ - oSettings.oApi._fnPageChange( oSettings, e.data.page ); - fnCallbackDraw( oSettings ); - e.preventDefault(); - } ); - }; - - /* Pages calculation */ - if ( oSettings._iDisplayLength === -1 ) - { - iStartButton = 1; - iEndButton = 1; - iCurrentPage = 1; - } - else if (iPages < iPageCount) - { - iStartButton = 1; - iEndButton = iPages; - } - else if (iCurrentPage <= iPageCountHalf) - { - iStartButton = 1; - iEndButton = iPageCount; - } - else if (iCurrentPage >= (iPages - iPageCountHalf)) - { - iStartButton = iPages - iPageCount + 1; - iEndButton = iPages; - } - else - { - iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; - iEndButton = iStartButton + iPageCount - 1; - } - - - /* Build the dynamic list */ - for ( i=iStartButton ; i<=iEndButton ; i++ ) - { - sList += (iCurrentPage !== i) ? - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' : - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>'; - } - - /* Loop over each instance of the pager */ - for ( i=0, iLen=an.length ; i<iLen ; i++ ) - { - if ( an[i].childNodes.length === 0 ) - { - continue; - } - - /* Build up the dynamic list forst - html and listeners */ - $('span:eq(0)', an[i]) - .html( sList ) - .children('a').each( fnBind ); - - /* Update the premanent botton's classes */ - anButtons = an[i].getElementsByTagName('a'); - anStatic = [ - anButtons[0], anButtons[1], - anButtons[anButtons.length-2], anButtons[anButtons.length-1] - ]; - - $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled ); - $([anStatic[0], anStatic[1]]).addClass( - (iCurrentPage==1) ? - oClasses.sPageButtonStaticDisabled : - oClasses.sPageButton - ); - $([anStatic[2], anStatic[3]]).addClass( - (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ? - oClasses.sPageButtonStaticDisabled : - oClasses.sPageButton - ); - } - } - } - } ); - - $.extend( DataTable.ext.oSort, { - /* - * text sorting - */ - "string-pre": function ( a ) - { - if ( typeof a != 'string' ) { - a = (a !== null && a.toString) ? a.toString() : ''; - } - return a.toLowerCase(); - }, - - "string-asc": function ( x, y ) - { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * html sorting (ignore html tags) - */ - "html-pre": function ( a ) - { - return a.replace( /<.*?>/g, "" ).toLowerCase(); - }, - - "html-asc": function ( x, y ) - { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "html-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * date sorting - */ - "date-pre": function ( a ) - { - var x = Date.parse( a ); - - if ( isNaN(x) || x==="" ) - { - x = Date.parse( "01/01/1970 00:00:00" ); - } - return x; - }, - - "date-asc": function ( x, y ) - { - return x - y; - }, - - "date-desc": function ( x, y ) - { - return y - x; - }, - - - /* - * numerical sorting - */ - "numeric-pre": function ( a ) - { - return (a=="-" || a==="") ? 0 : a*1; - }, - - "numeric-asc": function ( x, y ) - { - return x - y; - }, - - "numeric-desc": function ( x, y ) - { - return y - x; - } - } ); - - - $.extend( DataTable.ext.aTypes, [ - /* - * Function: - - * Purpose: Check to see if a string is numeric - * Returns: string:'numeric' or null - * Inputs: mixed:sText - string to check - */ - function ( sData ) - { - /* Allow zero length strings as a number */ - if ( typeof sData === 'number' ) - { - return 'numeric'; - } - else if ( typeof sData !== 'string' ) - { - return null; - } - - var sValidFirstChars = "0123456789-"; - var sValidChars = "0123456789."; - var Char; - var bDecimal = false; - - /* Check for a valid first char (no period and allow negatives) */ - Char = sData.charAt(0); - if (sValidFirstChars.indexOf(Char) == -1) - { - return null; - } - - /* Check all the other characters are valid */ - for ( var i=1 ; i<sData.length ; i++ ) - { - Char = sData.charAt(i); - if (sValidChars.indexOf(Char) == -1) - { - return null; - } - - /* Only allowed one decimal place... */ - if ( Char == "." ) - { - if ( bDecimal ) - { - return null; - } - bDecimal = true; - } - } - - return 'numeric'; - }, - - /* - * Function: - - * Purpose: Check to see if a string is actually a formatted date - * Returns: string:'date' or null - * Inputs: string:sText - string to check - */ - function ( sData ) - { - var iParse = Date.parse(sData); - if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) ) - { - return 'date'; - } - return null; - }, - - /* - * Function: - - * Purpose: Check to see if a string should be treated as an HTML string - * Returns: string:'html' or null - * Inputs: string:sText - string to check - */ - function ( sData ) - { - if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 ) - { - return 'html'; - } - return null; - } - ] ); - - - // jQuery aliases - $.fn.DataTable = DataTable; - $.fn.dataTable = DataTable; - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same point as - * fnDrawCallback. This may be useful for binding events or performing calculations when - * the table is altered at all. - * @name DataTable#draw - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Filter event, fired when the filtering applied to the table (using the build in global - * global filter, or column filters) is altered. - * @name DataTable#filter - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Sort event, fired when the sorting applied to the table is altered. - * @name DataTable#sort - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully drawn, - * including Ajax data loaded, if Ajax data is required. - * @name DataTable#init - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used</li></ol> - */ - - /** - * State save event, fired when the table has changed state a new state save is required. - * This method allows modification of the state saving object prior to actually doing the - * save, including addition or other state properties (for plug-ins) or modification - * of a DataTables core property. - * @name DataTable#stateSaveParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state - allowing modification - * of the saved state is required or loading of state for a plug-in. - * @name DataTable#stateLoadParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and the settings - * object has been modified by the loaded data. - * @name DataTable#stateLoaded - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing (be it, - * sort, filter or anything else). Can be used to indicate to the end user that - * there is something happening, or that something has finished. - * @name DataTable#processing - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to - * made to the server for new data (note that this trigger is called in fnServerData, - * if you override fnServerData and which to use this event, you need to trigger it in - * you success function). - * @name DataTable#xhr - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing - * the bDestroy:true parameter in the initialisation object. This can be used to remove - * bound events, added DOM nodes, etc. - * @name DataTable#destroy - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ -}(jQuery, window, document, undefined)); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.fixheadertable.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.fixheadertable.js deleted file mode 100644 index 9cfe00a5f2f845d1ae6015abf2db9e76404174a3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/jquery.fixheadertable.js +++ /dev/null @@ -1,990 +0,0 @@ -/* -* jquery.fixheadertable -* -* Copyright (c) 2010 Benjamin Léouzon -* http://www.tablefixedheader.com/ -* -* Licensed under MIT -* http://www.opensource.org/licenses/mit-license.php -* -* http://docs.jquery.com/Plugins/Authoring -* jQuery authoring guidelines -* -* Launch : December 2010 -* Version : 2.0 -*/ - -(function($) { - - $.fn.fixheadertable = function(options) { - - var defaults = { - - caption : '', - - showhide : true, - - theme : 'ui', - - height : null, - - width : null, - - minWidth : null, - - minWidthAuto : false, - - colratio : [], - - whiteSpace : 'nowrap', - - addTitles : false, - - zebra : false, - - zebraClass : 'ui-state-active', - - sortable : false, - - sortedColId : null, - - sortType : [], - - dateFormat : 'd-m-y', - - pager : false, - - rowsPerPage : 10, - - resizeCol : false, - - minColWidth : 100, - - wrapper : true - }; - - var options = $.extend(defaults, options); - - function util_getComputedStyle(element, property) { - - if (element.currentStyle) { - - var y = x.currentStyle[property]; - - } else if (window.getComputedStyle) { - - var y = document.defaultView.getComputedStyle(element, null).getPropertyValue(property); - } - - return y; - } - - function util_getScrollbarWidth () { - - var inner = $('<p/>').addClass('t_fixed_header_scroll_inner'); - - var outer = $('<div/>').addClass('t_fixed_header_scroll_outer'); - - outer.append(inner); - - $(document.body).append(outer); - - var w1 = inner[0].offsetWidth; - - outer.css('overflow', 'scroll'); - - var w2 = inner[0].offsetWidth; - - if (w1 == w2) w2 = outer[0].clientWidth; - - outer.remove(); - - return (w1 - w2); - } - - function util_parseDate (format, date) { - - var tsp = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0}, k, hl, dM; - - if(date && date !== null && date !== undefined){ - - date = $.trim(date); - - date = date.split(/[\\\/:_;.\t\T\s-]/); - - format = format.split(/[\\\/:_;.\t\T\s-]/); - - var dfmt = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - - var afmt = ["am", "pm", "AM", "PM"]; - - var h12to24 = function(ampm, h){ - - if (ampm === 0){ if (h == 12) { h = 0;} } - - else { if (h != 12) { h += 12; } } - - return h; - }; - - for (k=0, hl=format.length; k < hl; k++){ - - if(format[k] == 'M') { - - dM = $.inArray(date[k],dfmt); - - if(dM !== -1 && dM < 12){date[k] = dM+1;} - } - - if(format[k] == 'F') { - - dM = $.inArray(date[k],dfmt); - - if(dM !== -1 && dM > 11){date[k] = dM+1-12;} - } - - if(format[k] == 'a') { - - dM = $.inArray(date[k],afmt); - - if(dM !== -1 && dM < 2 && date[k] == afmt[dM]){ - - date[k] = dM; - - tsp.h = h12to24(date[k], tsp.h); - } - } - - if(format[k] == 'A') { - - dM = $.inArray(date[k],afmt); - - if(dM !== -1 && dM > 1 && date[k] == afmt[dM]){ - - date[k] = dM-2; - - tsp.h = h12to24(date[k], tsp.h); - } - } - - if(date[k] !== undefined) { - - tsp[format[k].toLowerCase()] = parseInt(date[k],10); - } - } - - tsp.m = parseInt(tsp.m,10)-1; - - var ty = tsp.y; - - if (ty >= 70 && ty <= 99) {tsp.y = 1900 + tsp.y;} - - else if (ty >=0 && ty <=69) {tsp.y= 2000 + tsp.y;} - } - - return new Date(tsp.y, tsp.m, tsp.d, tsp.h, tsp.i, tsp.s,0); - } - - return this.each(function() { - - var _table = $(this); - - var main_wrapper = null; - - var nbcol = $('thead th', this).length; - - var _initialWidth = $(this).width(); - - var _wrapper = null; - - var _headerscontainer = null; - - var _fillScrollbar = null; - - var _body = null; - - var _headers = null; - - var _scrollWidth = util_getScrollbarWidth(); - - var _colgroup = buildColgroup(nbcol); - - var _colgroup_body = null; - - var _nbRowsPerPage = 10; - - var _new_nbRowsPerPage = null; - - var _nbpages = null; - - var _nbpagesDiv = null; - - var _currentpage = null; - - var _pager = null; - - var _objectTable = null; - - var _stripNum = /[\$,%]/g; - - var _resizeInfo = null; - - var _resizeGhost = null; - - function buildTop (table) { - - _fillScrollbar = $('<div class="headtable ui-state-default" style="margin-right : 0px"></div>'); - - _headerscontainer = _fillScrollbar; - - _headerscontainer.insertBefore(table); - } - - function buildColgroup (nbcol) { - - var colgroup = $('<colgroup />'); - - if (options.colratio.length == 0) { - - var temp = null; - - for (var i = 0; i < nbcol; i++) { - - temp = $('<col style="width : ' + (100/nbcol) + '%" />'); - - colgroup.append(temp); - - temp = null; - } - - } else if (options.colratio.length == nbcol) { - - var cw = 0; - - for (var i = 0; i < nbcol; i++) { - - temp = $('<col style="width : ' + options.colratio[i] + 'px" />'); - - colgroup.append(temp); - - temp = null; - - cw += parseInt(options.colratio[i]); - } - - $(_table).css('width', cw + 'px'); - } - - return colgroup; - } - - function sortColumn (table, number, sens, th) { - - if ((options.sortType.length != 0) && (options.sortType.length == nbcol)) { - - var type = options.sortType[number]; - - if (type == 'float') { - - getSortKey = function(cell) { - - var key = parseFloat( String(cell).replace(_stripNum, '')); - - return isNaN(key) ? 0.00 : key; - } - - } else if (type == 'integer') { - - getSortKey = function(cell) { - - return cell ? parseFloat(String(cell).replace(_stripNum, '')) : 0; - } - - } else if (type == 'date') { - - getSortKey = function(cell) { - - return util_parseDate(options.dateFormat, cell).getTime(); - } - - } else { - - getSortKey = function(cell) { - - if(!cell) { cell =""; } - - return $.trim(String(cell).toLowerCase()); - } - } - - } else { - - getSortKey = function(cell) { - - if(!cell) { cell =""; } - - return $.trim(String(cell).toLowerCase()); - } - } - - _objectTable.sort(function(a, b){ - - var x = getSortKey(a[number]); - - var y = getSortKey(b[number]); - - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }) - - if(sens == 'DESC'){ - - _objectTable.reverse(); - } - - (options.pager) ? moveToPage(table) : objectToTable(_objectTable, table); - } - - function objectToTable(objectArray, table) { - - var body = $('tbody', table); - - body.children().remove(); - - if(options.zebra){ - - for (var i = 0; i < objectArray.length; i++){ - - (i%2) ? (tr = $('<tr class="' + options.zebraClass + '"></tr>')) : (tr = $('<tr></tr>')); - - for (var j in objectArray[i]){ - - tr.append($('<td class="ui-widget-content"></td>').html(objectArray[i][j])); - } - - body.append(tr); - } - - } else { - - for (var i = 0; i < objectArray.length; i++){ - - tr = $('<tr></tr>'); - - for (var j in objectArray[i]){ - - tr.append($('<td class="ui-widget-content"></td>').html(objectArray[i][j])); - } - - body.append(tr); - } - } - } - - function tableToObject(table) { - - var objectArray = []; - - $('tr', table).each(function(i){ - - var data = {}; - - $('td', this).each(function(j){ - - data[j] = $(this).html(); - }) - - objectArray.push(data); - }); - - return objectArray; - } - - function buildHeaders(table) { - - _headers = $('<table class="head"/>').append(_colgroup).append($('thead', table)); - - _headerscontainer.append(_headers); - - _headers.wrap('<div></div>'); - - var tab_headers = $('th', _headers); - - tab_headers.addClass('ui-widget-content ui-state-default'); - - if(options.sortable){ - - var th_div_sort = null; - - tab_headers.each(function(i){ - - $(this).contents().wrapAll('<div class="ui-sort"></div>'); - - th_div_sort = $('div.ui-sort', this); - - th_div_sort.click(function(){ - - tab_headers.removeClass('ui-state-hover'); - - $(this).parent().removeClass('ui-state-active').addClass('ui-state-hover'); - - $('span.ui-icon', tab_headers).remove(); - - if($(this).hasClass('sortedUp')){ - - sortColumn(table, i, "DESC", this); - - $(this).removeClass('sortedUp').addClass('sortedDown'); - - $(this).append('<span style="display : inline-block; vertical-align : middle" class="ui-icon ui-icon-triangle-1-s"></span>'); - - } else { - - sortColumn(table, i, "ASC", this); - - $(this).removeClass('sortedDown').addClass('sortedUp'); - - $(this).append('<span style="display : inline-block; vertical-align : middle" class="ui-icon ui-icon-triangle-1-n"></span>'); - } - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - }) - }); - - $('div.ui-sort', tab_headers).addClass('hover'); - } - - if(options.resizeCol && (options.colratio.length == nbcol)){ - - tab_headers.each(function(i){ - - var resizer = $('<span class="ui-resize"></span>'); - - $(this).prepend(resizer); - - resizer.mousedown(function(e){ - - dragStart(i, e); - - return false; - }) - }); - - _main_wrapper.mousemove(function(e){ - - if (_resizeInfo){ - - dragMove(e); - - return false; - } - }).mouseup(function(){ - - if (_resizeInfo){ - - dragEnd(); - - return false; - } - - return true; - }); - - function getOffset(col){ - - var ret = 0, cell = $('col', _colgroup), handler = $('th > span.ui-resize', _headers)[col], bso = _body[0].scrollLeft; - - for(var i = 0; i < col; i++){ - - ret += parseInt(cell[i].style.width); - } - - return handler.offsetLeft + 5 + ret - bso; - } - - function dragStart(i, x){ - - _resizeInfo = { id : i, startX : x.clientX , initTableWidth : getColratioWidth(), offset : getOffset(i) }; - - _resizeGhost.css({ display : 'block', height : _headerscontainer.height() + _body.height() + 2 + 'px', left : _resizeInfo.offset + 'px', cursor : 'col-resize' }); - } - - function dragMove(x){ - - var diff = x.clientX - _resizeInfo.startX; - - _resizeInfo.newWidth = parseInt($('col', _colgroup)[_resizeInfo.id].style.width) + diff; - - _resizeInfo.newTableWidth = _resizeInfo.initTableWidth + diff; - - if(_resizeInfo.newWidth > parseInt(options.minColWidth)){ - - _resizeGhost.css({ left : _resizeInfo.offset + diff + 'px' }); - - } else { - - _resizeInfo.newWidth = parseInt(options.minColWidth); - } - } - - function dragEnd(){ - - $(_colgroup.children()[_resizeInfo.id]).css({ width : _resizeInfo.newWidth + 'px' }); - - $(_colgroup_body.children()[_resizeInfo.id]).css({ width : _resizeInfo.newWidth + 'px' }); - - var wrapper_width = _resizeInfo.newTableWidth; - - _headers.css({ 'width' : wrapper_width + 'px' }); - - $(_table).css({ 'width' : wrapper_width + 'px' }); - - _resizeInfo = null; - - _resizeGhost.css({ display : 'none' }); - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - } - } - } - - function isIE6_7() { - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - - var ieversion = new Number(RegExp.$1); - - if (ieversion == 7 || ieversion == 6) { - - return true; - - } else { - return false; - } - } - } - - function isIE8() { - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - - var ieversion = new Number(RegExp.$1); - - if (ieversion == 8) { - - return true; - - } else { - return false; - } - } - } - - function buildBody (table) { - - _body = $('<div class="body ui-widget-content"></div>').insertBefore(table).append(table); - - if(options.height != null && !isNaN(parseInt(options.height))) { - - _body.css('height', options.height + 'px'); - } - - _colgroup_body = _colgroup.clone(); - - $(table).prepend(_colgroup_body); - - $('td', table).addClass('ui-widget-content'); - - $(table).wrap('<div></div>'); - - if (options.addTitles == true) { - - $('td', table).each(function() { - - $(this).attr('title', $(this).text()); - }); - } - - if (options.zebra) { - - $('tr:odd', table).addClass(options.zebraClass); - } - } - - function adaptScroll (table) { - - var scrollwidth = _scrollWidth; - - if(isIE6_7()){ - - scrollwidth = 0; - } - - var width = 0; - - if (parseInt($(table).height()) > parseInt(options.height)) { - - width = scrollwidth; - - overflow = 'scroll'; - - } else { - - width = 0; - - overflow = 'auto'; - } - - if($.browser.msie && options.height) { - - width = scrollwidth; - - overflow = 'scroll'; - } - - _fillScrollbar.css('margin-right', width); - - return overflow; - } - - function restrictRows(table, nbrows) { - - var length = _objectTable.length; - - var limit = 0; - - if(length < nbrows) { - - limit = length; - - } else { - - limit = nbrows; - } - - var _objectTableSliced = _objectTable.slice(0, limit); - - objectToTable(_objectTableSliced, table); - - _nbpages = Math.ceil(length / nbrows); - - _currentpage = 1; - - _nbpagesDiv.html('Showing page ' + _currentpage + ' of ' + _nbpages); - - _body.css('overflow-y', adaptScroll(table)); - - $('tr:last td', table).css('border-bottom-width', '1px'); - } - - function moveToNextPage(table) { - - _currentpage++; - - if(_currentpage >= (_nbpages)) { - - _currentpage = (_nbpages); - } - - moveToPage(table); - } - - function moveToPreviousPage(table) { - - _currentpage--; - - if(_currentpage <= 1) { - - _currentpage = 1; - } - - moveToPage(table); - } - - function moveToPage(table) { - - var length = _objectTable.length; - - var start, limit = 0; - - start = (_currentpage - 1) * _new_nbRowsPerPage; - - if(length < (_currentpage * _new_nbRowsPerPage)) { - - limit = length; - - } else { - - limit = (_currentpage * _new_nbRowsPerPage); - } - - var _objectTableSliced = _objectTable.slice(start, limit); - - objectToTable(_objectTableSliced, table); - - _nbpagesDiv.html('Showing page ' + _currentpage + ' of ' + _nbpages); - - _body.css('overflow-y', adaptScroll(table)); - - $('tr:last td', table).css('border-bottom-width', '1px'); - } - - function buildNavButton(className, callbackClick, buttonClass) { - - var button = $('<div class="button ui-state-default ' + buttonClass + '"><span class="ui-icon ' + className + '"> </span></div>'); - - _pager.append(button); - - button.mouseover(function(){ - - $(this).addClass('ui-state-hover'); - - }).mousedown(function(){ - - $(this).addClass('ui-state-active'); - - }).mouseup(function(){ - - $(this).removeClass('ui-state-active'); - - }).mouseout(function(){ - - $(this).removeClass('ui-state-active'); - - $(this).removeClass('ui-state-hover'); - - }).click(callbackClick); - } - - function buildPager(table) { - - _pager = $('<div class="pager ui-widget-header ui-corner-bottom ui-widget-content"></div>'); - - _main_wrapper.append(_pager); - - buildNavButton('ui-icon-arrowthickstop-1-e', function(){ - - _currentpage = _nbpages; - - moveToPage(table); - }, 'ui-corner-right'); - - buildNavButton('ui-icon ui-icon-arrowthick-1-e', function(){ - - moveToNextPage(table); - }, 'noborder'); - - buildNavButton('ui-icon ui-icon-arrowthick-1-w', function(){ - - moveToPreviousPage(table); - }, 'noborder'); - - buildNavButton('ui-icon-arrowthickstop-1-w', function(){ - - _currentpage = 1; - - moveToPage(table); - }, 'ui-corner-left noborder'); - - _button_set = - - $('<div id="' + table.id + '_radio" style="float : left">' + - - '<input type="radio" id="' + table.id + '_show_10_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_10_rows">10</label>' + - '<input type="radio" id="' + table.id + '_show_25_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_25_rows">25</label>' + - '<input type="radio" id="' + table.id + '_show_50_rows" name="' + table.id + '_radio" /><label for="' + table.id + '_show_50_rows">50</label>' + - '<input type="radio" id="' + table.id + '_show_100_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_100_rows">100</label>' + - - '</div>'); - - _pager.append(_button_set); - - $('#' + table.id + '_show_10_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_25_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 2.5; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_50_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 5; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_100_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 10; - - restrictRows(table, _new_nbRowsPerPage); - }); - - _nbpagesDiv = $('<div class="page_infos"></div>'); - - _pager.append(_nbpagesDiv); - - _new_nbRowsPerPage = _nbRowsPerPage; - - $('#' + table.id + '_show_' + options.rowsPerPage + '_rows', _pager).click(); - - _button_set.buttonset(); - } - - function getColratioWidth(){ - - var tw = 0; - - for(var i = 0; i < options.colratio.length; i++){ - - tw += parseInt(options.colratio[i]); - } - - return tw; - } - - /***********************/ - /********* MAIN ********/ - /***********************/ - - _wrapper = $('<div/>').addClass('t_fixed_header ui-state-default default ' + options.theme).insertBefore(this).append(this); - - _wrapper.css('border', 'none').css('font-weight', 'normal'); - - _main_wrapper = $('<div class="t_fixed_header_main_wrapper ui-widget ui-widget-header ' + options.theme + '"></div>'); - - if (options.whiteSpace == 'normal') { - - _wrapper.addClass('t_fixed_header_wrap'); - } - - buildTop(this); - - buildHeaders(this); - - buildBody(this); - - if(options.wrapper){ - - var tampon = _wrapper.wrap('<div class="ui-widget ui-widget-content ui-corner-all" style="padding : 5px; font-size : 1em;"></div>').parent(); - - } else { - - var tampon = _wrapper.wrap('<div></div>').parent(); - } - - if (options.width != null && !isNaN(parseInt(options.width)) && options.width > 0) { - - tampon.css('width', options.width + 'px'); - } - - var res = _wrapper.detach(); - - var main_wrapper_child = $('<div class="t_fixed_header_main_wrapper_child"></div>'); - - _main_wrapper.append(main_wrapper_child); - - main_wrapper_child.append(res); - - tampon.append(_main_wrapper); - - if(isIE6_7()){ - - _body.css('margin-bottom', 17 + 'px'); - } - - if (options.caption != '') { - - var caption = $('<div class="t_fixed_header_caption ui-widget-header ui-corner-top">' + options.caption + '</div>'); - - _main_wrapper.prepend(caption).addClass('ui-corner-all'); - - if (options.showhide) { - - var showhide = $('<div style="cursor : pointer; display : inline-block; vertical-align : middle; background : none; border : none;" class="ui-state-active"><span class="ui-icon ui-icon-triangle-1-n"> </span></div>'); - - caption.append(showhide); - - showhide.click(function(){ - - main_wrapper_child.toggle(); - - caption.toggleClass('toggle') - - if(_pager) _pager.toggle(); - - $('span', showhide).toggleClass('ui-icon-triangle-1-s'); - }); - - } - } - - if (options.sortable || options.pager) { - - _objectTable = tableToObject(this); - } - - if (options.pager) { - - buildPager(this); - } - - if(options.sortable && !isNaN(parseInt(options.sortedColId))) { - - var cur_th = $('th', _headers)[options.sortedColId]; - - $(cur_th).addClass('ui-state-hover') - - $('div.ui-sort', cur_th).click(); - } - - if(options.resizeCol && (options.colratio.length == nbcol)){ - - _resizeGhost = $('<div class="ui-resize-ghost ui-widget-header" style="height : ' + _main_wrapper.parent().height() + 'px"></div>'); - - _wrapper.append(_resizeGhost); - } - - _body.css('overflow-y', adaptScroll(this)); - - if (options.minWidth != null && !isNaN(parseInt(options.minWidth)) && options.minWidth > 0) { - - var minWidth = options.minWidth + 'px'; - - } else if (options.minWidthAuto) { - - if (options.colratio.length == nbcol) { - - var minWidth = $(this).width() + 'px'; - - } else { - - var minWidth = (_initialWidth + 150) + 'px'; - } - } - - _headerscontainer.children().first().css('min-width', minWidth); - - _body.children().first().css('min-width', minWidth); - - _body.scroll(function(){ - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - }); - - if (options.colratio.length == nbcol) { - - _wrapper.removeClass('default'); - - $(_headers).css('width', getColratioWidth() + 'px'); - } - }); - }; - -})(jQuery); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-body-style.css deleted file mode 100644 index 4fadb07da79ed7002c26094ae35a6a3332dccf62..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-body-style.css +++ /dev/null @@ -1,131 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E0E0E0; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color:#B2B2B2;; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.media-table-data-cell { - overflow: hidden; - -} - - -#media-table tr:nth-child(odd) td{ - background-color:#E0E0E0; -} - - -#media-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#media-table tr.media-table-data:hover { - font-weight: bold; - -} - -#media-table td{ - -padding:5px; -} - -#media-table tr.media-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#A8A8A8; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-browser.html deleted file mode 100644 index e495bc9b618e344aee412fad3aab95b6cdc2227d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/media-browser.html +++ /dev/null @@ -1,965 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Media Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="media-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> MEDIA </div> - <div id ="sectionsContainer"><div> - - -<!-- - <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Antibody Name</td><td> <input style="width: 200px" id="antibodyName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="media-table" style="float: left"> - <tr class="media-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>For What</th><th>Organism</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All media -var medias = null; - -/// The media that are currently being inspected -var inspectedMedias = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - console.log(sample.properties.SOLUTIONS_BUFFERS_PARENTS) - } - - -} - - -}; - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - media = objectOrId; - } else { - media = mediasById[objectOrId]; - } - - return media; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the medias variable */ -function initializeMedias(result) -{ - // Construct a map of all medias by id - mediasById = {}; - - // Split the medias into two groups, the ones that start with FRP in their sample name and the other ones. - var frpMedias = [], otherMedias = []; - var frpRegex = /^FRM[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - mediasById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the mediasById map - theSample = mediasById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpMedias.push(theSample); - } else { - otherMedias.push(theSample); - } - initializeSyntheticProperties(theSample); - - }); - - // Sort each of the groups - otherMedias.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpMedias.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of medias - medias = frpMedias.concat(otherMedias); -} - - - - -/** Set the size of the media-table based on whether or not inspectors are visible */ -function resizeMediaTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var mediaTableTransition = d3.selectAll('div.media-table-data-cell'); - mediaTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectMedia(media) -{ - if (inspectedMedias.indexOf(media) < 0) { - inspectedMedias.push(media); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var mediaToSend = $.extend({}, media); - delete mediaToSend.parents; - delete mediaToSend.children; - - } - resizeMediaTable(); - updateInspectors(1000); -} - -function closeInspector(media) -{ - var index = inspectedMedias.indexOf(media); - if (index < 0) { - return; - } - - inspectedMedias.splice(index, 1); - resizeMediaTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedMedias, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectMedia(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectMedia(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeMedias(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (medias.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#media-table").selectAll("tr.media-table-data").data(medias); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "media-table-data") - .style("cursor", "pointer") - .on("click", inspectMedia) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.FOR_WHAT, sample.properties.ORGANISM]; }) - .enter() - .append("td") - .append("div") - .attr("class", "media-table-data-cell") - .text(String) - -} - -function mediaFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#media-table").selectAll("tr.media-table-data").data(medias); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedMedias) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "MEDIA" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-body-style.css deleted file mode 100644 index a721e5602534ec2f8acff4cde1ca732ed71029ae..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-body-style.css +++ /dev/null @@ -1,129 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width:100%; - -} - - -.properties td:nth-child(odd) { - background-color:#CCFFFF; - width: 30%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width: 70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.oligo-table-data-cell { - overflow: hidden; -} - - -#oligo-table tr:nth-child(odd) { - background-color:#CCFFFF; -} - -#oligo-table tr:nth-child(even) { - background-color:#F7F7F7; -} - - - -#oligo-table tr.oligo-table-data:hover { - font-weight: bold; - -} - - -#oligo-table td{ - -padding:5px; -} - -#oligo-table tr.oligo-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#0099CC; -} - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-browser.html deleted file mode 100644 index 151a550f471bf3302761fd54040b4e7451bdfe13..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/oligo-browser.html +++ /dev/null @@ -1,578 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Oligo Browser</title> - <link type="text/css" rel="stylesheet" href="oligo-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All oligos -var oligos = null; - -/// The oligos that are currently being inspected -var inspectedOligos = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - //.style("float", "right") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order1 = ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "MODIFICATIONS", "SEQUENCE", "PROJECT"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = [ "BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - - return new_list2; -} - - - -/** Initialize the oligos variable */ -function initializeOligos(result) -{ - // Split the oligos into two groups, the ones that start with FRO in their sample name and the other ones. - var froOligos = [], otherOligos = []; - var froRegex = /^FRO[0-9]+/; - froRegex.compile(froRegex); - result.forEach(function(sample) { - if (froRegex.test(sample.code)) { - froOligos.push(sample); - } else { - otherOligos.push(sample); - } - }); - - // Sort each of the groups - otherOligos.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - froOligos.sort(function(a, b) { - // Sort based on the FRO number - var froNumberA = parseInt(a.code.substring(3)); - var froNumberB = parseInt(b.code.substring(3)); - return (froNumberA < froNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of oligos - oligos = froOligos.concat(otherOligos); -} - -/** Set the size of the oligo-table based on whether or not inspectors are visible */ -function resizeOligoTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%" - areInspectorsVisible = true; - - var oligoTableTransition = d3.selectAll('div.oligo-table-data-cell'); - oligoTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectOligo(oligo) -{ - if (inspectedOligos.indexOf(oligo) < 0) { - inspectedOligos.push(oligo); - openbisServer.listDataSetsForSample(oligo, true, dataset.curry(oligo)); - } - resizeOligoTable(); - updateInspectors(1000); -} - -function closeInspector(oligo) -{ - var index = inspectedOligos.indexOf(oligo); - if (index < 0) { - return; - } - - inspectedOligos.splice(index, 1); - resizeOligoTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedOligos, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeOligos(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (oligos.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "oligo-table-data") - .style("cursor", "pointer") - .on("click", inspectOligo) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.TARGET, sample.properties.DIRECTION,sample.properties.RESTRICTION_ENZYME, sample.properties.PROJECT]; }) - .enter() - .append("td") - .append("div") - .attr("class", "oligo-table-data-cell") - .text(String) - -} - -function oligoFilter(filter, property, element, index, array) { - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, targetFilterText, directionFilterText, enzymeFilterText, projectFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (targetFilterText == undefined) - { - targetFilterText = ""; - } - - if (directionFilterText == undefined) - { - directionFilterText = ""; - } - - if (enzymeFilterText == undefined) - { - enzymeFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - var displayedOligos = oligos.filter(oligoFilter.curry(codeFilterText, "CODE")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(targetFilterText, "TARGET")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(directionFilterText, "DIRECTION")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(enzymeFilterText, "RESTRICTION_ENZYME")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(projectFilterText, "PROJECT")); - - - var selection2 = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedOligos) != -1) { - return "table-row" - } else { - return "none" - } - }); - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "OLIGO" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamples(sampleCriteria, displayReturnedSamples); - -} - - - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#target_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#direction_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#enzyme_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> OLIGOS </div> - <div id ="sectionsContainer"><div> - - - - - - - <div id="filter-button" style="position:absolute; padding-top: 570px; left: 400px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="position:absolute; top: 680px; left: 400px"><td style="font-weight: bold; width: 200px">Target</td><td><input style="width: 200px" id="target_filter" type="text"></td></tr> - <tr style="position:absolute; top: 720px; left: 400px"><td style="font-weight: bold; width: 200px">Direction</td><td><input style="width: 200px" id="direction_filter" type="text"></td></tr> - <tr style="position:absolute; top: 760px; left: 400px"><td style="font-weight: bold; width: 200px">Restriction Enzyme</td><td> <input style="width: 200px" id="enzyme_filter" type="text"></td></tr> - <tr style="position:absolute; top: 800px; left: 400px; padding-bottom:20px"><td style="font-weight: bold; width: 200px">Project</td><td> <input style="width: 200px" id="project_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="oligo-table" style="float: left"> - <tr class="oligo-table-header"><th>Code</th><th>Target</th><th>Direction</th><th>Restriction Enzyme</th><th>Project</th></tr> - </table> - </div> - - <span id="inspectorsContainer"></span> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-body-style.css deleted file mode 100644 index addc0b12fc2bd2b3d990a764df1dd4d692e153cc..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-body-style.css +++ /dev/null @@ -1,131 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E5FFCC; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color:#B2B2B2;; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.pcr-table-data-cell { - overflow: hidden; - -} - - -#pcr-table tr:nth-child(odd) td{ - background-color:#E5FFCC; -} - - -#pcr-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#pcr-table tr.pcr-table-data:hover { - font-weight: bold; - -} - -#pcr-table td{ - -padding:5px; -} - -#pcr-table tr.pcr-table-header { - font-size:18px; - font-weight: bold; - color:black; - background-color: #CCFFCC; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-browser.html deleted file mode 100644 index ec8399ba929b052293d7b2b95765d1cb73e7b53f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/pcr-browser.html +++ /dev/null @@ -1,996 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>PCR Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="pcr-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> PCR </div> - <div id ="sectionsContainer"><div> - - - -<!-- - <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Antibody Name</td><td> <input style="width: 200px" id="antibodyName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px; height: 500px; top: 100px; overflow: auto"> - <table id="pcr-table" style="float: left"> - <tr class="pcr-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Template</th><th>Publication</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All pcr -var pcrs = null; - -/// The pcr that are currently being inspected -var inspectedpcrs = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "pcr_EVALUATION", "DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS", "GENERAL_pcr_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","SUGGESTIONS", "pcr_MODIFICATIONS", "REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - pcr = objectOrId; - } else { - pcr = pcrsById[objectOrId]; - } - - return pcr; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the pcrs variable */ -function initializepcrs(result) -{ - // Construct a map of all pcrs by id - pcrsById = {}; - - // Split the pcrs into two groups, the ones that start with FRP in their sample name and the other ones. - var frppcrs = [], otherpcrs = []; - var frpRegex = /^FRPROT[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - pcrsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the pcrsById map - theSample = pcrsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frppcrs.push(theSample); - } else { - otherpcrs.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherpcrs.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frppcrs.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of pcrs - pcrs = frppcrs.concat(otherpcrs); -} - - - - -/** Set the size of the pcr-table based on whether or not inspectors are visible */ -function resizepcrTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var pcrTableTransition = d3.selectAll('div.pcr-table-data-cell'); - pcrTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectpcr(pcr) -{ - if (inspectedpcrs.indexOf(pcr) < 0) { - inspectedpcrs.push(pcr); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var pcrToSend = $.extend({}, pcr); - delete pcrToSend.parents; - delete pcrToSend.children; - - } - resizepcrTable(); - updateInspectors(1000); -} - -function closeInspector(pcr) -{ - var index = inspectedpcrs.indexOf(pcr); - if (index < 0) { - return; - } - - inspectedpcrs.splice(index, 1); - resizepcrTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedpcrs, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectpcr(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectpcr(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializepcrs(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (pcrs.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#pcr-table").selectAll("tr.pcr-table-data").data(pcrs); - // Code under enter is run if there is no HTML element for a data element - - - - selection - .enter() - .append("tr") - .attr("class", "pcr-table-data") - .style("cursor", "pointer") - .on("click", inspectpcr) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.TEMPLATE, sample.properties.PUBLICATION]; }) - .enter() - .append("td") - .append("div") - .attr("class", "pcr-table-data-cell") - .text(String) - -} - -function pcrFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#pcr-table").selectAll("tr.pcr-table-data").data(pcrs); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedpcrs) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PCR" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-body-style.css deleted file mode 100644 index 14f3fd885a156abdc6213c5436ffd8cbc7393d4d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-body-style.css +++ /dev/null @@ -1,131 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color: #ffe5cc; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.plasmid-table-data-cell { - overflow: hidden; - -} - - -#plasmid-table tr:nth-child(odd) td{ - background-color:#ffe5cc; -} - - -#plasmid-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#plasmid-table tr.plasmid-table-data:hover { - font-weight: bold; - -} - -#plasmid-table td{ - -padding:5px; -} - -#plasmid-table tr.plasmid-table-header { - font-size:18px; - font-weight: bold; - color:#000000; - background-color:#ffcb99; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-browser.html deleted file mode 100644 index e7cfb99bf964549398049a67f89b35a685c76252..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/plasmid-browser.html +++ /dev/null @@ -1,801 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Plasmid Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="plasmid-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> PLASMIDS </div> - <div id ="sectionsContainer"><div> - - <div id="filter-button" style="position:absolute; padding-top: 570px; left: 400px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="position:absolute; top: 680px; left: 400px"><td style="font-weight: bold; width: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="position:absolute; top: 720px; left: 400px"><td style="font-weight: bold; width: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="position:absolute; top: 760px; left: 400px"><td style="font-weight: bold; width: 200px">Plasmid Name</td><td> <input style="width: 200px" id="plasmidName_filter" type="text"></td></tr> - <tr style="position:absolute; top: 800px; left: 400px"><td style="font-weight: bold; width: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="position:absolute; top: 840px; left: 400px"><td style="font-weight: bold; width: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="position:absolute; top: 880px; left: 400px"><td style="font-weight: bold; width: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="plasmid-table" > - <tr class="plasmid-table-header"><th>Code</th><th>Owner</th><th>Owner Number</th><th>Plasmid Name</th><th>Backbone</th><th>Bacterial Antibiotic Resistance</th><th>(Yeast) Marker</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -//openbisServer = new openbis('https://localhost:8443/openbis/openbis', 'https://bs-mbp156.ethz.ch:8443/datastore_server'); - - -// Some global variables we refer to - -/// All plasmids -var plasmids = null; - -/// The plasmids that are currently being inspected -var inspectedPlasmids = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - //.style("float", "right") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS", "YEAST_PARENTS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - plasmid = objectOrId; - } else { - plasmid = plasmidsById[objectOrId]; - } - - return plasmid; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the plasmids variable */ -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - - - - -/** Set the size of the plasmid-table based on whether or not inspectors are visible */ -function resizePlasmidTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedPlasmids.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - console.log(cellWidth) - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var plasmidTableTransition = d3.selectAll('div.plasmid-table-data-cell'); - plasmidTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectPlasmid(plasmid) -{ - if (inspectedPlasmids.indexOf(plasmid) < 0) { - inspectedPlasmids.push(plasmid); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var plasmidToSend = $.extend({}, plasmid); - delete plasmidToSend.parents; - delete plasmidToSend.children; - openbisServer.listDataSetsForSample(plasmidToSend, true, dataset.curry(plasmid)); - } - resizePlasmidTable(); - updateInspectors(1000); -} - -function closeInspector(plasmid) -{ - var index = inspectedPlasmids.indexOf(plasmid); - if (index < 0) { - return; - } - - inspectedPlasmids.splice(index, 1); - resizePlasmidTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedPlasmids, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializePlasmids(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (plasmids.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "plasmid-table-data") - .style("cursor", "pointer") - .on("click", inspectPlasmid) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.OWNER.split('_').join(" "), sample.properties.OWNER_NUMBER, sample.properties.PLASMID_NAME, sample.properties.BACKBONE.split('_').join(' '), sample.properties.BACTERIAL_ANTIBIOTIC_RESISTANCE,sample.properties.YEAST_MARKER]; }) - .enter() - .append("td") - .append("div") - .attr("class", "plasmid-table-data-cell") - .text(String) - -} - -function plasmidFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, plasmidNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (plasmidNameFilterText == undefined) - { - plasmidNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedPlasmids = plasmids.filter(plasmidFilter.curry(ownerFilterText, "OWNER")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(plasmidNameFilterText, "PLASMID_NAME")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(backboneFilterText, "BACKBONE")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedPlasmids) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PLASMID" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#plasmidName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/reset-min.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/reset-min.css deleted file mode 100644 index 00c38928735a824b65249efaf3dd11bc10570bbc..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/reset-min.css +++ /dev/null @@ -1,8 +0,0 @@ -/* -Copyright (c) 2010, Yahoo! Inc. All rights reserved. -Code licensed under the BSD License: -http://developer.yahoo.com/yui/license.html -version: 3.3.0 -build: 3167 -*/ -html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;} \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-body-style.css deleted file mode 100644 index 69626e5eb4b86b055f231a2a3e0cd1a92ae4b34f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-body-style.css +++ /dev/null @@ -1,128 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - - -.properties td:nth-child(odd) { - background-color: #FFFFCC; - width:30%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - - - - -.eachsample-table-data-cell { - overflow: hidden; - -} - -#eachsample-table tr:nth-child(odd) td{ - background-color: #FFFFCC; -} - -#eachsample-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - - -#eachsample-table tr.eachsample-table-data:hover { - font-weight: bold; -} - - - -#eachsample-table td{ -padding:5px; -} - -#eachsample-table tr.eachsample-table-header { - - font-size:18px; - font-weight: bold; - color:black; - background-color: #FFFF99; - -} - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-browser.html deleted file mode 100644 index 77d21f9457c0dda8db05688c95dbe1853ed863e6..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/search-browser.html +++ /dev/null @@ -1,392 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Search</title> - <link type="text/css" rel="stylesheet" href="search-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -//openbisServer = new openbis("/openbis/openbis", "https://localhost:8444/datastore_server") -// Some global variables we refer to - -/// All eachsamples -var eachsamples = null; - -/// The eachsamples that are currently being inspected -var inspectedEachsamples = []; - - - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -/** Initialize the eachsamples variable */ -function initializeEachsamples(result) -{ - // Split the eachsamples into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all eachsamples by id - eachsamplesById = {}; - - // Split the eachsamples into two groups, the ones that start with FRP in their sample name and the other ones. - var fryEachsamples = [], otherEachsamples = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - eachsamplesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the eachsamplesById map - theSample = eachsamplesById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryEachsamples.push(theSample); - } else { - otherEachsamples.push(theSample); - } - - }); - - // Sort each of the groups - otherEachsamples.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryEachsamples.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of eachsamples - eachsamples = fryEachsamples.concat(otherEachsamples); - console.log(eachsamples) -} - - - -/** Set the size of the eachsample-table based on whether or not inspectors are visible */ - - -function inspectEachsample(eachsample) -{ - if (null == eachsample) { - // Ignore this -- it is not a eachsample - return; - } - - - - window.open(eachsample.sampleTypeCode.toLowerCase() +"-browser.html?code=" + eachsample.code, "_blank"); - - -} - -function closeInspector(eachsample) -{ - var index = inspectedEachsamples.indexOf(eachsample); - if (index < 0) { - return; - } - - inspectedEachsamples.splice(index, 1); - resizeEachsampleTable(); - updateInspectors(1000); -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeEachsamples(data.result); - - - - - d3.select("#vis").select("#eachsample-table").selectAll("tr.eachsample-table-data").remove(); - var selection = d3.select("#vis").select("#eachsample-table").selectAll("tr.eachsample-table-data").data(eachsamples); - // Code under enter is run if there is no HTML element for a data element - - -var searchText = $('#search').val(); -var searchRegexpText = ("*" + searchText + "*").replace(/\*/g, ".*"); -var searchRegexp = new RegExp(searchRegexpText, "i"); - -selection - .enter() - .append("tr") - .attr("class", "eachsample-table-data") - .style("cursor", "pointer") - .on("click", inspectEachsample) - .selectAll("td").data(function(sample) { return [sample.sampleTypeCode, sample.identifier.slice(11,50), sample.properties, sample.properties ]; }) - .enter() - .append("td") - .append("div") - .attr("class", "eachsample-table-data-cell") - .text(function(d, index){ - if(index == 2){ - if(searchText && searchText.length > 0 && d){ - for(propertyName in d){ - var propertyValue = d[propertyName]; - if(propertyValue && searchRegexp.test(propertyValue)){ - return propertyValue; - } - } - } - } - else if (index ==3){ - if(searchText && searchText.length > 0 && d){ - for(propertyName in d){ - var propertyValue = d[propertyName]; - if(propertyValue && searchRegexp.test(propertyValue)){ - return propertyName; - } - } - } - } - else{ - return d; - } - - return "" - }) - -} - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showSearchedSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AnyFieldMatchClause", - fieldType : "ANY_FIELD", - desiredValue : "*" + $("#search").val() + "*" - } - ], - operator : "MATCH_ANY_CLAUSES" -}; - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute:"TYPE", - desiredValue : "*" - } - ], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - -function showMatchingField() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute:"TYPE", - desiredValue : "*" - } - ], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - populateMenu(); - - //showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $("#search").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('#search').submit(); - return false; - } else { - return true; - } - }); - - $('#search').submit(function() { - showSearchedSamples(); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS Yeast Lab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> SEARCH ALL SAMPLE TYPES </div> - <div id ="sectionsContainer"><div> - - - - - <div id="search-field" "> - <table> - <tr style="position:absolute; top: 100px; left: 200px"><td style="font-weight: bold; width: 100px">Search</td><td><form><input style="width: 200px" id="search" type="text"></form></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 150px; overflow: auto"> - <table id="eachsample-table" cellpadding="0" cellspacing="0" border="1" bordercolor="white" class="display" width="100%"> - <thead > - <tr class="eachsample-table-header"><th>Sample Type</th><th>Code</th><th>Matched Text</th><th>Matching Field</th></tr> - </thead> - <tbody></tbody> - </table> - </div> - - - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/simplified-yeast-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/simplified-yeast-browser.html deleted file mode 100644 index 5c69177f52ccc8c16e2f7fc34b6386d2f38267dd..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/simplified-yeast-browser.html +++ /dev/null @@ -1,353 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style-modified.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - - didCreateVis = true; -} - - - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } -//position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto - - - -var titles = ["Code", "Owner", "Owner Number", "Yeast Strain Name", "Project", "Plasmids", "Yeast Parents", "Genetic Background", "Mating Type"] - - var th = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(titles) - .enter() - .append("th") - .style( "font-size","18px") - .style("font-weight", "bold") - .style("color", "#fff") - .style("background-color","#5C5C1F") - .attr("class", "yeast-table-header") - .text(String) - - - var selection = d3.select("#vis") - - .select("#yeast-table") - .style("position","absolute").style("width", "400px").style("left", "200px").style("top", "100px").style("height", "200px").style("overflow", "auto") - .selectAll("tr.yeast-table-data").data(yeasts) - .enter() - .append("tr") - - - .attr("class", "yeast-table-data") - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.OWNER, sample.properties.OWNER_NUMBER, sample.properties.YEAST_STRAIN_NAME, sample.properties.PROJECT, sample.properties.PLASMIDS, sample.properties.YEAST_PARENTS, sample.properties.GENETIC_BACKGROUND, sample.properties.MATING_TYPE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .text(String) - - - - - -}; - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - }], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis(); - - //showChildrenSamples(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> YEASTS </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;;top:10px">Logout</button> - </div> - <div id="chemical_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/chemicals-browser.html">Chemicals</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:200px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/plasmid-browser.html">Plasmids</a> - </div> - <div id="yeast_browser" style="position: absolute; left:10px; top:250px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/yeast-browser.html">Yeasts</a> - </div> - - - - <div id="vis"> - <table id="yeast-table" cellpadding="0" cellspacing="0" border="1" bordercolor="white" class="display" width="100%"> - </table> - </div> - - - - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html deleted file mode 100644 index 3261063c4a2e6ad3d7541d4cd67625556c1bce0b..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html +++ /dev/null @@ -1,971 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Solutions Buffers Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="buffer-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> SOLUTIONS BUFFERS </div> - <div id ="sectionsContainer"><div> - - -<!-- <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">buffer Name</td><td> <input style="width: 200px" id="bufferName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> ---> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="buffer-table" style="float: left"> - <tr class="buffer-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>For What</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All buffers -var buffers = null; - -/// The buffers that are currently being inspected -var inspectedbuffers = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - console.log(sample.properties.SOLUTIONS_BUFFERS_PARENTS) - } - - -} - - -}; - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - buffer = objectOrId; - } else { - buffer = buffersById[objectOrId]; - } - - return buffer; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the buffers variable */ -function initializebuffers(result) -{ - // Construct a map of all buffers by id - buffersById = {}; - - // Split the buffers into two groups, the ones that start with FRP in their sample name and the other ones. - var frpbuffers = [], otherbuffers = []; - var frpRegex = /^FRSOB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - buffersById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the buffersById map - theSample = buffersById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpbuffers.push(theSample); - } else { - otherbuffers.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherbuffers.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpbuffers.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(5)); - var frpNumberB = parseInt(b.code.substring(5)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of buffers - buffers = frpbuffers.concat(otherbuffers); -} - - - -/** Set the size of the buffer-table based on whether or not inspectors are visible */ -function resizebufferTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var bufferTableTransition = d3.selectAll('div.buffer-table-data-cell'); - bufferTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectbuffer(buffer) -{ - if (inspectedbuffers.indexOf(buffer) < 0) { - inspectedbuffers.push(buffer); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var bufferToSend = $.extend({}, buffer); - delete bufferToSend.parents; - delete bufferToSend.children; - openbisServer.listDataSetsForSample(bufferToSend, true, dataset.curry(buffer)); - } - resizebufferTable(); - updateInspectors(1000); -} - -function closeInspector(buffer) -{ - var index = inspectedbuffers.indexOf(buffer); - if (index < 0) { - return; - } - - inspectedbuffers.splice(index, 1); - resizebufferTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedbuffers, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbuffer(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbuffer(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets -// var dataSetRow = box.select("table.properties").append("tr"); -// dataSetRow -// .append("td") -// .attr("class", "property") -// .text("DATA_SETS"); -// dataSetRow -// .append("td") -// .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializebuffers(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (buffers.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#buffer-table").selectAll("tr.buffer-table-data").data(buffers); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "buffer-table-data") - .style("cursor", "pointer") - .on("click", inspectbuffer) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.FOR_WHAT]; }) - .enter() - .append("td") - .append("div") - .attr("class", "buffer-table-data-cell") - .text(String) - -} - -function bufferFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, bufferNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (bufferNameFilterText == undefined) - { - bufferNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedbuffers = buffers.filter(bufferFilter.curry(ownerFilterText, "OWNER")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(bufferNameFilterText, "buffer_NAME")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(backboneFilterText, "BACKBONE")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#buffer-table").selectAll("tr.buffer-table-data").data(buffers); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedbuffers) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "SOLUTIONS_BUFFERS" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#bufferName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/template_sample-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/template_sample-browser.html deleted file mode 100644 index 768f45e18754dc1f6e7db80c9d6061f0a2327d3c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/template_sample-browser.html +++ /dev/null @@ -1,913 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - -// Some global variables we refer to -var SAMPLE_TYPE = "TEMPLATE_SAMPLE"; -var SAMPLE_TYPE_PROPERTIES = ["TEMPLATE_DESCRIPTION", "TEMPLATE_NUMBER", "TEMPLATE_TEXT"]; -var SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME = ["Description", "Number", "Text"]; - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var plasmidValue = sample.properties.PLASMIDS; - sample.properties.PLASMIDS_PARENTS = []; - - if (!xmlValueRegex.test(plasmidValue)) - return; - - globalValue = plasmidValue; - var plasmidXml = xmlParser.parseFromString(plasmidValue, "text/xml"); - - - for (i=1; i < plasmidXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = plasmidXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - if (sampleNode.attributes.getNamedItem("annotation") != null) { - var annotation = sampleNode.attributes.getNamedItem("annotation").value; - } - else{ - var annotation = ""; - } - if (sampleNode.attributes.getNamedItem("rel") != null) { - var relationship = sampleNode.attributes.getNamedItem("rel").value; - } - else{ - var relationship = ""; - } - } - - var PLASMIDS_PARENTS = null; - - if (relationship == "INT"){ - PLASMIDS_PARENTS = " " + code + "::" + annotation; - } - if (relationship == "MOD"){ - PLASMIDS_PARENTS = " " + code + "_" + annotation; - } - if (relationship == "DEL"){ - PLASMIDS_PARENTS = " " + code + "_D_" + annotation; - } - if (relationship == "") { - PLASMIDS_PARENTS = code; - } - - sample.properties.PLASMIDS_PARENTS.push(PLASMIDS_PARENTS); - -} - - - var yeastParentsValue = sample.properties.YEAST_PARENTS; - sample.properties.YEASTS_PARENTS = []; - - - if (!xmlValueRegex.test(yeastParentsValue)) - return; - - globalValue2 = yeastParentsValue; - var yeastParentsXml = xmlParser.parseFromString(yeastParentsValue, "text/xml"); - - for (i=1; i < yeastParentsXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleYeastNode = yeastParentsXml.childNodes.item(0).childNodes.item(i); - - var yeastsDisplay = null; - - if (sampleYeastNode.attributes.getNamedItem("code") != null ) { - var yeastCode = sampleYeastNode.attributes.getNamedItem("code").value; - } - - yeastsDisplay = yeastCode; - - sample.properties.YEASTS_PARENTS.push(yeastsDisplay); - - } - -}; - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = SAMPLE_TYPE_PROPERTIES - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEASTS_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - - } else { - yeast = yeastsById[objectOrId]; - - } - - - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - - - - - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - - - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - - var selection = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - -selection - .enter() - .append("tr") - .attr("class", "yeast-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { - var tableFields = [sample.code]; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES.length; i++) { - tableFields[tableFields.length] = sample.properties[SAMPLE_TYPE_PROPERTIES[i]]; - } - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .text(String) - -} - - -/** - * Filters - */ - - -function yeastFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - - - - -/** - * Function visualize filters - */ -function visualize(filterResults) -{ - var displayedYeasts; - - for(var i=0; i < SAMPLE_TYPE_PROPERTIES.length;i++) { - if(i == 0) { - displayedYeasts = yeasts.filter(yeastFilter.curry(((filterResults[i] == undefined)?"":filterResults[i]), SAMPLE_TYPE_PROPERTIES[i])); - } else { - displayedYeasts = displayedYeasts.filter(yeastFilter.curry((filterResults[i] == undefined)?"":filterResults[i],SAMPLE_TYPE_PROPERTIES[i])); - } - } - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - -}; - - - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : SAMPLE_TYPE - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - //showChildrenSamples(); - populateMenu(); - createTableFromProperties(); - createTableFilterFromProperties(); - createVisualizeFiltersFromProperties(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - - - $('#search').keyup(function() { - visualize($('#search').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"/> - <div id="login-form-div" style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> TEMPLATE_SAMPLE </div> - <div id ="sectionsContainer"><div> - <div id='filter-button' style='padding-top: 570px; padding-left: 400px; font-weight:bold; padding-bottom:30px;'> <a onclick ="javascript:ShowHide('HiddenDiv')" href='javascript:;' >Filters</a> </div> - <div class="mid" id="HiddenDiv" style="display: none;"> <table id="filterContainer"></table></div> - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <div id="tableContainer"></div> - </div> - - <div id="inspectorsContainer" style="float:right "></div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/webapp.js b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/webapp.js deleted file mode 100644 index 1fe2e0bad4ea699d52ebeec6aac084b6538eeecf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/webapp.js +++ /dev/null @@ -1,59 +0,0 @@ - -function showSamplesRecursively(top, samples, depth) -{ - if (depth > 2) return; - - var sampEnter = - top.selectAll("div.samp") - .data(samples) - .enter() - .append("div") - .attr("class", "samp") - .style("left", depth > 0 ? "40px" : 0) - .text(function(d) { return d.identifier}); - - showSamplesRecursively(sampEnter, function(d) {return d.parents ? d.parents : [] }, depth + 1); -} - -function showSamplesWithParents(samples) { - var top = d3.select("#main"); - samples = samples.filter(function(d) {return d.parents != null}); - showSamplesRecursively(top, samples, 0); -} - -function retrieveAndShowSamplesWithParents() { - - var samplesWithParentsSc = - { - operator : "MATCH_ALL_CLAUSES", - subCriterias: [ - { - targetEntityKind: "SAMPLE_PARENT", - criteria: { - matchClauses : [ - {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : "FR*" - }]} - } - ] - }; - - openbisServer.searchForSamplesWithFetchOptions( - samplesWithParentsSc, - ["PROPERTIES", "ANCESTORS"], - function(data) { showSamplesWithParents(data.result) }); - -} - - -function enterApp() -{ - $("#login-form-div").hide(); - $("#main").show(); - $('#openbis-logo').height(50); - - retrieveAndShowSamplesWithParents(); -} - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-body-style.css deleted file mode 100644 index ce803fd5ed52cc755ee65f293b443b9140e6b2e2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-body-style.css +++ /dev/null @@ -1,131 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#E5FFCC; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color:#B2B2B2;; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Table */ - - -.western_blotting-table-data-cell { - overflow: hidden; - -} - - -#western_blotting-table tr:nth-child(odd) td{ - background-color:#E5FFCC; -} - - -#western_blotting-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - -#western_blotting-table tr.western_blotting-table-data:hover { - font-weight: bold; - -} - -#western_blotting-table td{ - -padding:5px; -} - -#western_blotting-table tr.western_blotting-table-header { - font-size:18px; - font-weight: bold; - color:black; - background-color: #CCFFCC; - - - -} - - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-browser.html deleted file mode 100644 index 1709eec67197dbdc702cdfeea3d29792cf95d4d2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/western_blotting-browser.html +++ /dev/null @@ -1,1044 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Genereal Protocol Browser</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link type="text/css" rel="stylesheet" href="western_blotting-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -</head> - -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> WESTERN BLOTTING </div> - <div id ="sectionsContainer"><div> - - - - -<!-- - <div id="filter-button" style="padding-left:400px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Antibody Name</td><td> <input style="width: 200px" id="antibodyName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Backbone</td><td> <input style="width: 200px" id="backbone_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">Bacterial Antibitioc Resistance</td><td> <input style="width: 200px" id="antibiotic_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 400px">(Yeast) Marker</td><td> <input style="width: 200px" id="marker_filter" type="text"></td></tr> - </table> - </div> - --> - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px; height: 500px; top: 100px; overflow: auto"> - <table id="western_blotting-table" style="float: left"> - <tr class="western_blotting-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Storage</th><th>Publication</th></tr> - </table> - </div> - <span id="inspectorsContainer"></span> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All western_blotting -var western_blottings = null; - -/// The western_blotting that are currently being inspected -var inspectedwestern_blottings = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var antibodyValue = sample.properties.ANTIBODIES; - sample.properties.ANTIBODY_PARENTS = []; - - if (!xmlValueRegex.test(antibodyValue)) - return; - - globalValue = antibodyValue; - var antibodyXml = xmlParser.parseFromString(antibodyValue, "text/xml"); - - - for (i=1; i < antibodyXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = antibodyXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var ANTIBODY_PARENTS = null; - - - ANTIBODY_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.ANTIBODY_PARENTS.push(ANTIBODY_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM", "KIT"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION","DETAILS", "EPITOPE", "CLONALITY", "ISOTYPE", "COMMENTS", "PUBLICATION" ] - - - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","ANTIBODY_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["MEMBRANE","ANTIBODY_DILUTION","ANTIBODY_SOLUTION", "COMMENTS" ] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - western_blotting = objectOrId; - } else { - western_blotting = western_blottingsById[objectOrId]; - } - - return western_blotting; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the western_blottings variable */ -function initializewestern_blottings(result) -{ - // Construct a map of all western_blottings by id - western_blottingsById = {}; - - // Split the western_blottings into two groups, the ones that start with FRP in their sample name and the other ones. - var frpwestern_blottings = [], otherwestern_blottings = []; - var frpRegex = /^FRWB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - western_blottingsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the western_blottingsById map - theSample = western_blottingsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpwestern_blottings.push(theSample); - } else { - otherwestern_blottings.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherwestern_blottings.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpwestern_blottings.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of western_blottings - western_blottings = frpwestern_blottings.concat(otherwestern_blottings); -} - - - - -/** Set the size of the western_blotting-table based on whether or not inspectors are visible */ -function resizewestern_blottingTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var western_blottingTableTransition = d3.selectAll('div.western_blotting-table-data-cell'); - western_blottingTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectwestern_blotting(western_blotting) -{ - if (inspectedwestern_blottings.indexOf(western_blotting) < 0) { - inspectedwestern_blottings.push(western_blotting); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var western_blottingToSend = $.extend({}, western_blotting); - delete western_blottingToSend.parents; - delete western_blottingToSend.children; - - } - resizewestern_blottingTable(); - updateInspectors(1000); -} - -function closeInspector(western_blotting) -{ - var index = inspectedwestern_blottings.indexOf(western_blotting); - if (index < 0) { - return; - } - - inspectedwestern_blottings.splice(index, 1); - resizewestern_blottingTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedwestern_blottings, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectwestern_blotting(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectwestern_blotting(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializewestern_blottings(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (western_blottings.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#western_blotting-table").selectAll("tr.western_blotting-table-data").data(western_blottings); - // Code under enter is run if there is no HTML element for a data element - - - - selection - .enter() - .append("tr") - .attr("class", "western_blotting-table-data") - .style("cursor", "pointer") - .on("click", inspectwestern_blotting) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.STORAGE, sample.properties.PUBLICATION]; }) - .enter() - .append("td") - .append("div") - .attr("class", "western_blotting-table-data-cell") - .text(String) - -} - -function western_blottingFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#western_blotting-table").selectAll("tr.western_blotting-table-data").data(western_blottings); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedwestern_blottings) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "WESTERN_BLOTTING" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style-modified.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style-modified.css deleted file mode 100644 index 6826f412199c98a5ef9ca00e25cc2117fadf48cd..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style-modified.css +++ /dev/null @@ -1,61 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - - - - - -/**#yeast-table{ position:absolute; left:200px; width: 100px; height: 100px; top: 100px; overflow: auto;}**/ - -yeast.table { counter-reset: line-number; } - -.yeast-table-data-cell { - overflow: hidden; - -} - -#yeast-table tr:nth-of-type(odd) { - background-color:#A6A64D; -} - -#yeast-table tr:nth-of-type(even) { - background-color:#ECEFEF; -} - - -#yeast-table tr.yeast-table-data:hover { - font-weight: bold; -} - - -#yeast-table tr.yeast-table-data td { - padding: 5px; -} - -#yeast-table tr.yeast-table-data:hover td { - padding: 5px 2px; -} - -#yeast-table td{ - -padding:5px; - -} - - -#yeast-table th { - - padding-left:5px; - padding-right:5px; -} - - - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style.css b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style.css deleted file mode 100644 index e89acd78af9895eb8d3eab6cf4ffdec37f3de186..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-body-style.css +++ /dev/null @@ -1,128 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { - padding-top: 10px; - font: 12px "Verdana", sans-serif; } -} -div#vis div { padding-top: 2px;} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - - -.properties td:nth-child(odd) { - background-color: #FFFFCC; - width:30%; -} - -.properties td:nth-child(even) { - background-color:#F7F7F7; - width:70%; -} - - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - - - - -.yeast-table-data-cell { - overflow: hidden; - -} - -#yeast-table tr:nth-child(odd) td{ - background-color: #FFFFCC; -} - -#yeast-table tr:nth-child(even) td{ - background-color:#F7F7F7; -} - - -#yeast-table tr.yeast-table-data:hover { - font-weight: bold; -} - - - -#yeast-table td{ -padding:5px; -} - -#yeast-table tr.yeast-table-header { - - font-size:18px; - font-weight: bold; - color:black; - background-color: #FFFF99; - -} - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-d3table.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-d3table.html deleted file mode 100644 index 1d4acd5a1ec70406a6215dbe27329d0afae44143..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-d3table.html +++ /dev/null @@ -1,986 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEAST_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - // plasmid =objectOrId; - } else { - yeast = yeastsById[objectOrId]; - // plasmid = plasmidsById[objectOrId]; - } - - //return yeast, plasmid; - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - //return d.identifier.slice(11,50); - return d.identifier - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - - - - var yeastdataset = yeasts; - data(function(sample) { - return [sample.identifier.slice(11,50), sample.properties.OWNER]} - - var id = sample.identifier.slice(11,50) - var owner = sample.properties.OWNER - var own_num = sample.properties.OWNER_NUMBER - - - - - var data = [ - {Code: id, Owner: Owner, OwnerNumber: own_num} - - ] - - function transform(attrName) { - d3.select("tbody").selectAll("tr").remove(); - -// Header - var th = d3.select("thead").selectAll("th") - .data(jsonToArray(data[0])) - .enter().append("th") - .attr("onclick", function (d, i) { return "transform('" + d[0] + "');";}) - .text(function(d) { return d[0]; }) - -// Rows - var tr = d3.select("tbody").selectAll("tr") - .data(data) - .enter().append("tr") - .sort(function (a, b) { return a == null || b == null ? 0 : stringCompare(a[attrName], b[attrName]); }); - -// Cells - var td = tr.selectAll("td") - .data(function(d) { return jsonToArray(d); }) - .enter().append("td") - .attr("onclick", function (d, i) { return "transform('" + d[0] + "');";}) - .text(function(d) { return d[1]; }); - -} - -function stringCompare(a, b) { - a = a.toLowerCase(); - b = b.toLowerCase(); - return a > b ? 1 : a == b ? 0 : -1; -} - -function jsonKeyValueToArray(k, v) {return [k, v];} - -function jsonToArray(json) { - var ret = new Array(); - var key; - for (key in json) { - if (json.hasOwnProperty(key)) { - ret.push(jsonKeyValueToArray(key, json[key])); - } - } - return ret; -}; - - - - - -} - - -/** - * Filters - */ -function yeastFilter(filter, property, element, index, array) { - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - -/** - * Function visualize filters - */ -function visualize(ownerFilterText, ownerNumFilterText, yeastNameFilterText, projectFilterText, plasmidsFilterText, yeastParentsFilterText, geneticBackgroundFilterText, matingTypeFilterText ) -{ - - - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (yeastNameFilterText == undefined) - { - yeastNameFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - if (plasmidsFilterText == undefined) - { - plasmidsFilterText = ""; - } - - if (yeastParentsFilterText == undefined) - { - yeastParentsFilterText = ""; - } - - if (geneticBackgroundFilterText == undefined) - { - geneticBackgroundFilterText = ""; - } - - if (matingTypeFilterText == undefined) - { - matingTypeFilterText = ""; - } - - var displayedYeasts = yeasts.filter(yeastFilter.curry(ownerFilterText, "OWNER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastNameFilterText, "YEAST_STRAIN_NAME")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(projectFilterText, "PROJECT")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(plasmidsFilterText, "PLASMIDS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastParentsFilterText, "YEAST_PARENTS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(geneticBackgroundFilterText, "GENETIC_BACKGROUND")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(matingTypeFilterText, "MATING_TYPE")); - - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - - -}; - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis(); - - //showChildrenSamples(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#plasmids_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastParents_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#geneticBackground_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#matingType_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> YEASTS </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;;top:10px">Logout</button> - </div> - <div id="chemical_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/chemicals-browser.html">Chemicals</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:200px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/plasmid-browser.html">Plasmids</a> - </div> - <div id="yeast_browser" style="position: absolute; left:10px; top:250px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/yeast-browser.html">Yeasts</a> - </div> - - - <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Strain Name</td><td> <input style="width: 200px" id="yeastName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Project</td><td> <input style="width: 200px" id="project_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Plasmids</td><td> <input style="width: 200px" id="plasmids_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Parents</td><td> <input style="width: 200px" id="yeastParents_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Genetic Background</td><td> <input style="width: 200px" id="geneticBackground_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Mating Type</td><td> <input style="width: 200px" id="matingType_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="yeast-table" cellpadding="0" cellspacing="0" border="0" class="display" width="100%"> - <thead > - <!-- <tr class="yeast-table-header"><th>Yeast Code</th><th>Owner</th><th>Owner Number</th><th>Yeast Strain Name</th><th>Project</th><th>Plasmids</th><th>Yeast Parents</th><th>Genetic Background</th><th>Mating Type</th></tr>--> - </thead> - <tbody></tbody> - </table> - </div> - - - <div id="inspectorsContainer" style="float:right "></div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-fixedheader.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-fixedheader.html deleted file mode 100644 index 51be66aa94c473019fd7f1771c4b8532eb5cf7d4..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-fixedheader.html +++ /dev/null @@ -1,965 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEAST_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - // plasmid =objectOrId; - } else { - yeast = yeastsById[objectOrId]; - // plasmid = plasmidsById[objectOrId]; - } - - //return yeast, plasmid; - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - //return d.identifier.slice(11,50); - return d.identifier - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - - var selection = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - -selection - .enter() - .append("tr") - .attr("class", "yeast-table-data") - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.OWNER, sample.properties.OWNER_NUMBER, sample.properties.YEAST_STRAIN_NAME, sample.properties.PROJECT, sample.properties.PLASMIDS, sample.properties.YEAST_PARENTS, sample.properties.GENETIC_BACKGROUND, sample.properties.MATING_TYPE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .text(String) - -} - - -/** - * Filters - */ -function yeastFilter(filter, property, element, index, array) { - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - -/** - * Function visualize filters - */ -function visualize(ownerFilterText, ownerNumFilterText, yeastNameFilterText, projectFilterText, plasmidsFilterText, yeastParentsFilterText, geneticBackgroundFilterText, matingTypeFilterText ) -{ - - - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (yeastNameFilterText == undefined) - { - yeastNameFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - if (plasmidsFilterText == undefined) - { - plasmidsFilterText = ""; - } - - if (yeastParentsFilterText == undefined) - { - yeastParentsFilterText = ""; - } - - if (geneticBackgroundFilterText == undefined) - { - geneticBackgroundFilterText = ""; - } - - if (matingTypeFilterText == undefined) - { - matingTypeFilterText = ""; - } - - var displayedYeasts = yeasts.filter(yeastFilter.curry(ownerFilterText, "OWNER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastNameFilterText, "YEAST_STRAIN_NAME")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(projectFilterText, "PROJECT")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(plasmidsFilterText, "PLASMIDS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastParentsFilterText, "YEAST_PARENTS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(geneticBackgroundFilterText, "GENETIC_BACKGROUND")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(matingTypeFilterText, "MATING_TYPE")); - - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - - -}; - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - } ], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis(); - - //showChildrenSamples(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#plasmids_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastParents_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#geneticBackground_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#matingType_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> YEASTS </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;;top:10px">Logout</button> - </div> - <div id="chemical_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/chemicals-browser.html">Chemicals</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:200px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/plasmid-browser.html">Plasmids</a> - </div> - <div id="yeast_browser" style="position: absolute; left:10px; top:250px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/yeast-browser.html">Yeasts</a> - </div> - - - <div id="filter-button" style="padding-left:200px; padding-top: 620px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Strain Name</td><td> <input style="width: 200px" id="yeastName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Project</td><td> <input style="width: 200px" id="project_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Plasmids</td><td> <input style="width: 200px" id="plasmids_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Parents</td><td> <input style="width: 200px" id="yeastParents_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Genetic Background</td><td> <input style="width: 200px" id="geneticBackground_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Mating Type</td><td> <input style="width: 200px" id="matingType_filter" type="text"></td></tr> - </table> - </div> - - <div id ="theads"> - <div style = "position:absolute; left:201px; top: 100px " > - <table id = "theaders" cellpadding="0" cellspacing="0" border="1" bordercolor="white" class="display" width="100%" > - <!-- <tr class="yeast-table-header"><th>Yeast Code</th><th>Owner</th><th>Owner Number</th><th>Yeast Strain Name</th><th>Project</th><th>Plasmids</th><th>Yeast Parents</th><th>Genetic Background</th><th>Mating Type</th></tr>--> - <tr> - <td style="font-weight: bold; padding-left: 10px; width: 45px">Yeast Code</td> - <td style="font-weight: bold; padding-left: 60px; width: 113px">Owner</td> - <td style="font-weight: bold; padding-left: 10px; width: 59px">Owner Number</td> - <td style="font-weight: bold; padding-left: 30px; width: 151px">Yeast Strain Name</td> - <td style="font-weight: bold; padding-left: 10px; width: 73px">Project</td> - <td style="font-weight: bold; padding-left: 100px; width: 143px">Plasmids</td> - <td style="font-weight: bold; padding-left: 70px; width: 140px">Yeast Parents</td> - <td style="font-weight: bold; padding-left: 0px; width: 30px">Genetic Background</td> - <td style="font-weight: bold; padding-left: 20px; width: 55px">Mating Type</td> - </tr> - </table> - </div> - - - -<!-- <td style="font-weight: bold; padding-left: 10px; width: 20px">Yeast Code</td> - <td style="font-weight: bold; padding-left: 80px; width: 50px">Owner</td> - <td style="font-weight: bold; padding-left: 70px; width: 50px">Owner Number</td> - <td style="font-weight: bold; padding-left: 80px; width: 100px">Yeast Strain Name</td> - <td style="font-weight: bold; padding-left: 30px; width: 50px">Project</td> - <td style="font-weight: bold; padding-left: 100px; width: 50px">Plasmids</td> - <td style="font-weight: bold; padding-left: 150px; width: 100px">Yeast Parents</td> - <td style="font-weight: bold; padding-left: 70px; width: 30px">Genetic Background</td> - <td style="font-weight: bold; padding-left: 20px; width: 55px">Mating Type</td>--> - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1200px;height: 500px; top: 135px; overflow: auto"> - <table id="yeast-table" cellpadding="0" cellspacing="0" border="1" bordercolor="white" class="display" width="100%"> - </table> - </div> - - - <div id="inspectorsContainer" style="float:right "></div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-tables-redone.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-tables-redone.html deleted file mode 100644 index b858d2446da0add2e4d0f231bd45a20c234b535e..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser-tables-redone.html +++ /dev/null @@ -1,950 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style.css" /> - <link type="text/css" rel="stylesheet" href="base.css" /> - <link type="text/css" rel="stylesheet" href="reset-min.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="jquery.dataTables.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - <script type="text/javascript" charset="utf-8"> - $(document).ready(function() { - $('#example').dataTable( { - "sPaginationType": "full_numbers" - } ); - } ); - </script> - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEAST_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - // plasmid =objectOrId; - } else { - yeast = yeastsById[objectOrId]; - // plasmid = plasmidsById[objectOrId]; - } - - //return yeast, plasmid; - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - //return d.identifier.slice(11,50); - return d.identifier - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#example").selectAll("tr.example-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "example-data") - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { - var string = sample.properties - - console.log(string) - return [sample.identifier.slice(11,50), sample.properties.OWNER, sample.properties.OWNER_NUMBER, sample.properties.YEAST_STRAIN_NAME, sample.properties.PROJECT, sample.properties.PLASMIDS, sample.properties.YEAST_PARENTS, sample.properties.GENETIC_BACKGROUND, sample.properties.MATING_TYPE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "example-data-cell") - .text(String) - - -} - - -/** - * Filters - */ -function yeastFilter(filter, property, element, index, array) { - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - -/** - * Function visualize filters - */ -function visualize(ownerFilterText, ownerNumFilterText, yeastNameFilterText, projectFilterText, plasmidsFilterText, yeastParentsFilterText, geneticBackgroundFilterText, matingTypeFilterText ) -{ - - - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (yeastNameFilterText == undefined) - { - yeastNameFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - if (plasmidsFilterText == undefined) - { - plasmidsFilterText = ""; - } - - if (yeastParentsFilterText == undefined) - { - yeastParentsFilterText = ""; - } - - if (geneticBackgroundFilterText == undefined) - { - geneticBackgroundFilterText = ""; - } - - if (matingTypeFilterText == undefined) - { - matingTypeFilterText = ""; - } - - var displayedYeasts = yeasts.filter(yeastFilter.curry(ownerFilterText, "OWNER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastNameFilterText, "YEAST_STRAIN_NAME")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(projectFilterText, "PROJECT")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(plasmidsFilterText, "PLASMIDS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastParentsFilterText, "YEAST_PARENTS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(geneticBackgroundFilterText, "GENETIC_BACKGROUND")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(matingTypeFilterText, "MATING_TYPE")); - - - var selection2 = d3.select("#vis").select("#example").selectAll("tr.example-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - - -}; - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "PARENTS", "CHILDREN"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis(); - - //showChildrenSamples(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#plasmids_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastParents_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#geneticBackground_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#matingType_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; height: 100px;"/> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <div id = "title" style="padding-top:20px"> YEASTS </div> - <div id="button-group"> - <button id="logout-button" style="position: absolute; right:10px;;top:10px">Logout</button> - </div> - <div id="chemical_browser" style="position: absolute; left:10px; top:100px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/chemicals-browser.html">Chemicals</a> - </div> - <div id="oligo_browser" style="position: absolute; left:10px; top:150px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/oligo-browser.html">Oligos</a> - </div> - <div id="plasmid_browser" style="position: absolute; left:10px; top:200px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/plasmid-browser.html">Plasmids</a> - </div> - <div id="yeast_browser" style="position: absolute; left:10px; top:250px"> - <a href="file:///Users/barillac/workspace/plasmid/source/html/yeastlabbrowser/yeast-browser.html">Yeasts</a> - </div> - - - <div id="filter-button" style="padding-left:200px; padding-top: 570px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Strain Name</td><td> <input style="width: 200px" id="yeastName_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Project</td><td> <input style="width: 200px" id="project_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Plasmids</td><td> <input style="width: 200px" id="plasmids_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Yeast Parents</td><td> <input style="width: 200px" id="yeastParents_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Genetic Background</td><td> <input style="width: 200px" id="geneticBackground_filter" type="text"></td></tr> - <tr style="padding-top: 15px"><td style="font-weight: bold; padding-left: 200px">Mating Type</td><td> <input style="width: 200px" id="matingType_filter" type="text"></td></tr> - </table> - </div> - - - <div id="vis"> - <div style="position:absolute; left:200px"> - <table id="example" border="0" cellpadding="0" cellspacing="0" class="pretty"> - <thead > - <tr><th>Yeast Code</th><th>Owner</th><th>Owner Number</th><th>Yeast Strain Name</th><th>Project</th><th>Plasmids</th><th>Yeast Parents</th><th>Genetic Background</th><th>Mating Type</th></tr> - </thead> - <tbody></tbody> - </table> - </div> - - - <div id="inspectorsContainer" style="float:right "></div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser.html deleted file mode 100644 index 5e0b9bd482e5ccd4dfc329fc996c1878f72f3658..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/html/yeast-browser.html +++ /dev/null @@ -1,1017 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>Yeast Browser</title> - <link type="text/css" rel="stylesheet" href="yeast-body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="d3.tsv.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="infra.js"></script> - <script type="text/javascript" src="common.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <script type="text/javascript" language="javascript" src="jquery.dataTables.js"></script> - - <!--<script type="text/javascript" src="/openbis/resources/js/openbis.js"></script>--> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "absolute") - .style("overflow", "auto") - .style("left", "1250px") - .style("top", "100px") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var plasmidValue = sample.properties.PLASMIDS; - sample.properties.PLASMIDS_PARENTS = []; - - if (!xmlValueRegex.test(plasmidValue)) - return; - - globalValue = plasmidValue; - var plasmidXml = xmlParser.parseFromString(plasmidValue, "text/xml"); - - - for (i=1; i < plasmidXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = plasmidXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - if (sampleNode.attributes.getNamedItem("annotation") != null) { - var annotation = sampleNode.attributes.getNamedItem("annotation").value; - } - else{ - var annotation = ""; - } - if (sampleNode.attributes.getNamedItem("rel") != null) { - var relationship = sampleNode.attributes.getNamedItem("rel").value; - } - else{ - var relationship = ""; - } - } - - var PLASMIDS_PARENTS = null; - - if (relationship == "INT"){ - PLASMIDS_PARENTS = " " + code + "::" + annotation; - } - if (relationship == "MOD"){ - PLASMIDS_PARENTS = " " + code + "_" + annotation; - } - if (relationship == "DEL"){ - PLASMIDS_PARENTS = " " + code + "_D_" + annotation; - } - if (relationship == "") { - PLASMIDS_PARENTS = code; - } - - sample.properties.PLASMIDS_PARENTS.push(PLASMIDS_PARENTS); - -} - - - var yeastParentsValue = sample.properties.YEAST_PARENTS; - sample.properties.YEASTS_PARENTS = []; - - - if (!xmlValueRegex.test(yeastParentsValue)) - return; - - globalValue2 = yeastParentsValue; - var yeastParentsXml = xmlParser.parseFromString(yeastParentsValue, "text/xml"); - - for (i=1; i < yeastParentsXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleYeastNode = yeastParentsXml.childNodes.item(0).childNodes.item(i); - - var yeastsDisplay = null; - - if (sampleYeastNode.attributes.getNamedItem("code") != null ) { - var yeastCode = sampleYeastNode.attributes.getNamedItem("code").value; - } - - yeastsDisplay = yeastCode; - - sample.properties.YEASTS_PARENTS.push(yeastsDisplay); - - } - -}; - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS_PARENTS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEASTS_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - - } else { - yeast = yeastsById[objectOrId]; - - } - - - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - - - - - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - - - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - - var selection = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - -selection - .enter() - .append("tr") - .attr("class", "yeast-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { return [sample.identifier.slice(11,50), sample.properties.OWNER.split('_').join(" "), sample.properties.OWNER_NUMBER, sample.properties.YEAST_STRAIN_NAME, sample.properties.PROJECT, sample.properties.PLASMIDS_PARENTS, sample.properties.YEASTS_PARENTS, sample.properties.GENETIC_BACKGROUND, sample.properties.MATING_TYPE]; }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .text(String) - -} - - -/** - * Filters - */ - - -function yeastFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - - - - -/** - * Function visualize filters - */ -function visualize(ownerFilterText, ownerNumFilterText, yeastNameFilterText, projectFilterText, plasmidsFilterText, yeastParentsFilterText, geneticBackgroundFilterText, matingTypeFilterText ) -{ - - - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (yeastNameFilterText == undefined) - { - yeastNameFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - if (plasmidsFilterText == undefined) - { - plasmidsFilterText = ""; - } - - if (yeastParentsFilterText == undefined) - { - yeastParentsFilterText = ""; - } - - if (geneticBackgroundFilterText == undefined) - { - geneticBackgroundFilterText = ""; - } - - if (matingTypeFilterText == undefined) - { - matingTypeFilterText = ""; - } - - var displayedYeasts = yeasts.filter(yeastFilter.curry(ownerFilterText, "OWNER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastNameFilterText, "YEAST_STRAIN_NAME")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(projectFilterText, "PROJECT")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(plasmidsFilterText, "PLASMIDS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastParentsFilterText, "YEAST_PARENTS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(geneticBackgroundFilterText, "GENETIC_BACKGROUND")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(matingTypeFilterText, "MATING_TYPE")); - - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - - -}; - - - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - - - - - -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - //showChildrenSamples(); - - populateMenu(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#plasmids_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastParents_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#geneticBackground_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#matingType_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#search').keyup(function() { - visualize($('#search').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; left: 10px; width: 120px;"> - <div id="login-form-div"style="position: absolute; left: 300px; top: 200px;"> - <h1>openBIS YeastLab</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - -<div id="main"> - <div id = "title" style="padding-top:20px"> YEASTS </div> - <div id ="sectionsContainer"><div> - - - - <div id="filter-button" style=" padding-top: 570px; padding-left: 400px; font-weight:bold; padding-bottom:30px;"> - <a onclick ="javascript:ShowHide('HiddenDiv')" href="javascript:;" >Filters</a> - </div> - - <div class="mid" id="HiddenDiv" style="DISPLAY: none;"> - <table> - <tr style="position:absolute; top: 680px; left: 400px"><td style="font-weight: bold; width: 200px">Owner</td><td><input style="width: 200px" id="owner_filter" type="text"></td></tr> - <tr style="position:absolute; top: 720px; left: 400px"><td style="font-weight: bold; width:200px">Owner Number</td><td><input style="width: 200px" id="ownerNum_filter" type="text"></td></tr> - <tr style="position:absolute; top: 760px; left: 400px"><td style="font-weight: bold; width: 200px">Yeast Strain Name</td><td> <input style="width: 200px" id="yeastName_filter" type="text"></td></tr> - <tr style="position:absolute; top: 800px; left: 400px"><td style="font-weight: bold; width: 200px">Project</td><td> <input style="width: 200px" id="project_filter" type="text"></td></tr> - <tr style="position:absolute; top: 840px; left: 400px"><td style="font-weight: bold; width: 200px">Plasmids</td><td> <input style="width: 200px" id="plasmids_filter" type="text"></td></tr> - <tr style="position:absolute; top: 880px; left: 400px"><td style="font-weight: bold; width: 200px">Yeast Parents</td><td> <input style="width: 200px" id="yeastParents_filter" type="text"></td></tr> - <tr style="position:absolute; top: 920px; left: 400px"><td style="font-weight: bold; width: 200px">Genetic Background</td><td> <input style="width: 200px" id="geneticBackground_filter" type="text"></td></tr> - <tr style="position:absolute; top: 960px; left: 400px; padding-bottom:20px"><td style="font-weight: bold; width: 200px">Mating Type</td><td> <input style="width: 200px" id="matingType_filter" type="text"></td></tr> - </table> - </div> - - - - - - <div id="vis"> - <div style="position:absolute; left:200px; width: 1000px;height: 500px; top: 100px; overflow: auto"> - <table id="yeast-table" cellpadding="0" cellspacing="0" border="1" bordercolor="white" class="display" width="100%"> - <thead > - <tr class="yeast-table-header"><th>Code</th><th>Owner</th><th>Owner Number</th><th>Yeast Strain Name</th><th>Project</th><th>Plasmids</th><th>Yeast Parents</th><th>Genetic Background</th><th>Mating Type</th></tr> - </thead> - <tbody></tbody> - </table> - </div> - - - - <div id="inspectorsContainer" style="float:right "></div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/plugin.properties b/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/plugin.properties deleted file mode 100644 index 9a94ff03bf056593809e33328f4b5346335829e1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/1/as/webapps/yeastlabbrowser/plugin.properties +++ /dev/null @@ -1 +0,0 @@ -webapp-folder = html diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/antibody-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/antibody-browser.html deleted file mode 100644 index 5a017993a15b5c7f3223f70ff3cffcd03364e44c..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/antibody-browser.html +++ /dev/null @@ -1,847 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Antibodies</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="antibody-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>Host</th><th>For What</th></tr> - </thead> - <tbody id='antibody-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All antibodys -var antibodys = null; - -/// The antibodys that are currently being inspected -var inspectedAntibodys = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT", "MATERIALS" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION","DETAILS", "EPITOPE", "CLONALITY", "ISOTYPE", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["MEMBRANE","ANTIBODY_DILUTION","ANTIBODY_SOLUTION", "COMMENTS" ] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - antibody = objectOrId; - } else { - antibody = antibodysById[objectOrId]; - } - - return antibody; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the antibodys variable */ -function initializeAntibodys(result) -{ - // Construct a map of all antibodys by id - antibodysById = {}; - - // Split the antibodys into two groups, the ones that start with FRP in their sample name and the other ones. - var frpAntibodys = [], otherAntibodys = []; - var frpRegex = /^FRAB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - antibodysById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the antibodysById map - theSample = antibodysById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpAntibodys.push(theSample); - } else { - otherAntibodys.push(theSample); - } - }); - - // Sort each of the groups - otherAntibodys.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpAntibodys.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of antibodys - antibodys = frpAntibodys.concat(otherAntibodys); -} - - - -/** Set the size of the antibody-table based on whether or not inspectors are visible */ -function resizeAntibodyTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var antibodyTableTransition = d3.selectAll('div.antibody-table-data-cell'); - antibodyTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectAntibody(antibody) -{ - if (inspectedAntibodys.indexOf(antibody) < 0) { - inspectedAntibodys.push(antibody); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var antibodyToSend = $.extend({}, antibody); - delete antibodyToSend.parents; - delete antibodyToSend.children; - openbisServer.listDataSetsForSample(antibodyToSend, true, dataset.curry(antibody)); - } - resizeAntibodyTable(); - updateInspectors(1000); -} - -function closeInspector(antibody) -{ - var index = inspectedAntibodys.indexOf(antibody); - if (index < 0) { - return; - } - - inspectedAntibodys.splice(index, 1); - resizeAntibodyTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedAntibodys, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectAntibody(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectAntibody(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeAntibodys(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (antibodys.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#antibody-table").selectAll("tr.antibody-table-data").data(antibodys); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "antibody-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectAntibody) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.HOST, sample.properties.FOR_WHAT]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "antibody-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function antibodyFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#antibody-table").selectAll("tr.antibody-table-data").data(antibodys); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedAntibodys) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "ANTIBODY" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bacteria-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bacteria-browser.html deleted file mode 100644 index fbd3a7bbc91d855074441e289e79ab396321d491..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bacteria-browser.html +++ /dev/null @@ -1,846 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Bacteria</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="bacteria-table-header"><th>Code</th><th>Bacteria Strain Name</th><th>Bacteria Genotype</th><th>For What</th><th>Supplier</th><th>Art. Number</th><th>Comments</th><th></th></tr> - </thead> - <tbody id='bacteria-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All bacterias -var bacterias = null; - -/// The bacterias that are currently being inspected -var inspectedbacterias = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["BOX_NUMBER", "ROW", "COLUMN"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_lis4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - bacteria = objectOrId; - } else { - bacteria = bacteriasById[objectOrId]; - } - - return bacteria; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the bacterias variable */ -function initializebacterias(result) -{ - // Construct a map of all bacterias by id - bacteriasById = {}; - - // Split the bacterias into two groups, the ones that start with FRP in their sample name and the other ones. - var frpbacterias = [], otherbacterias = []; - var frpRegex = /^FRE[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - bacteriasById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the bacteriasById map - theSample = bacteriasById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpbacterias.push(theSample); - } else { - otherbacterias.push(theSample); - } - }); - - // Sort each of the groups - otherbacterias.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpbacterias.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of bacterias - bacterias = frpbacterias.concat(otherbacterias); -} - - - -/** Set the size of the bacteria-table based on whether or not inspectors are visible */ -function resizebacteriaTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var bacteriaTableTransition = d3.selectAll('div.bacteria-table-data-cell'); - bacteriaTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectbacteria(bacteria) -{ - if (inspectedbacterias.indexOf(bacteria) < 0) { - inspectedbacterias.push(bacteria); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var bacteriaToSend = $.extend({}, bacteria); - delete bacteriaToSend.parents; - delete bacteriaToSend.children; - openbisServer.listDataSetsForSample(bacteriaToSend, true, dataset.curry(bacteria)); - } - resizebacteriaTable(); - updateInspectors(1000); -} - -function closeInspector(bacteria) -{ - var index = inspectedbacterias.indexOf(bacteria); - if (index < 0) { - return; - } - - inspectedbacterias.splice(index, 1); - resizebacteriaTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedbacterias, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbacteria(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializebacterias(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (bacterias.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacterias); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "bacteria-table-data") - .style("cursor", "pointer") - .on("click", inspectbacteria) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.BACTERIA_STRAIN_NAME, sample.properties.BACTERIA_GENOTYPE, sample.properties.WHAT_FOR, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.COMMENTS]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "bacteria-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function bacteriaFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, bacteriaNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (bacteriaNameFilterText == undefined) - { - bacteriaNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedbacterias = bacterias.filter(bacteriaFilter.curry(ownerFilterText, "OWNER")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(bacteriaNameFilterText, "bacteria_NAME")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(backboneFilterText, "BACKBONE")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedbacterias = displayedbacterias.filter(bacteriaFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#bacteria-table").selectAll("tr.bacteria-table-data").data(bacterias); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedbacterias) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "BACTERIA" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#bacteriaName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bacteriaName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.css b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.css deleted file mode 100644 index c0bba15b36ec511ed667d80f98bfd06c787ba037..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.css +++ /dev/null @@ -1,1109 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.min.css b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.min.css deleted file mode 100644 index 96a435be907ed88c540fd2f512cf01316a7157c9..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.css b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.css deleted file mode 100644 index 5b7fe7e8562e97d4e959322617ed1feb45b2fd6d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.css +++ /dev/null @@ -1,6167 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover, -a:focus { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover, -a.muted:focus { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover, -a.text-error:focus { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover, -a.text-success:focus { - color: #356635; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 5px; - padding-left: 5px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #dff0d8; -} - -.table tbody tr.error > td { - background-color: #f2dede; -} - -.table tbody tr.warning > td { - background-color: #fcf8e3; -} - -.table tbody tr.info > td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover > td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.min.css b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.min.css deleted file mode 100644 index df96c86485dd20f436bd7a79808cae66579501f8..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings-white.png b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings.png b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/img/glyphicons-halflings.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.js deleted file mode 100644 index 44109f62d47997d0d3ee4c65384cf8fac5dfc026..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,2280 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#transitions - * =================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#alerts - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#buttons - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#carousel - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#collapse - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#dropdowns - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) - } - $parent.toggleClass('open') - } - - $this.focus() - - return false - } - - , keydown: function (e) { - var $this - , $items - , $active - , $parent - , isActive - , index - - if (!/(38|40|27)/.test(e.keyCode)) return - - $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items - .eq(index) - .focus() - } - - } - - function clearMenus() { - $('.dropdown-backdrop').remove() - $(toggle).each(function () { - getParent($(this)).removeClass('open') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = selector && $(selector) - - if (!$parent || !$parent.length) $parent = $this.parent() - - return $parent - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* DROPDOWN NO CONFLICT - * ==================== */ - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(document) - .on('click.dropdown.data-api', clearMenus) - .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery); -/* ========================================================= - * bootstrap-modal.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#modals - * ========================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - this.options.remote && this.$element.find('.modal-body').load(this.options.remote) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element.show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : - that.$element.focus().trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - - $.support.transition && this.$element.hasClass('fade') ? - this.hideWithTransition() : - this.hideModal() - } - - , enforceFocus: function () { - var that = this - $(document).on('focusin.modal', function (e) { - if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { - that.$element.focus() - } - }) - } - - , escape: function () { - var that = this - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.modal') - } - } - - , hideWithTransition: function () { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - that.hideModal() - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - that.hideModal() - }) - } - - , hideModal: function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden') - }) - } - - , removeBackdrop: function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - , backdrop: function (callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - this.$backdrop.click( - this.options.backdrop == 'static' ? - $.proxy(this.$element[0].focus, this.$element[0]) - : $.proxy(this.hide, this) - ) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (callback) { - callback() - } - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.modal - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL NO CONFLICT - * ================= */ - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - /* MODAL DATA-API - * ============== */ - - $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - , href = $this.attr('href') - , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) - - e.preventDefault() - - $target - .modal(option) - .one('hide', function () { - $this.focus() - }) - }) - -}(window.jQuery); -/* =========================================================== - * bootstrap-tooltip.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - , triggers - , trigger - , i - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - triggers = this.options.trigger.split(' ') - - for (i = triggers.length; i--;) { - trigger = triggers[i] - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var defaults = $.fn[this.type].defaults - , options = {} - , self - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }, this) - - self = $(e.currentTarget)[this.type](options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , pos - , actualWidth - , actualHeight - , placement - , tp - , e = $.Event('show') - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - pos = this.getPosition() - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - this.applyPlacement(tp, placement) - this.$element.trigger('shown') - } - } - - , applyPlacement: function(offset, placement){ - var $tip = this.tip() - , width = $tip[0].offsetWidth - , height = $tip[0].offsetHeight - , actualWidth - , actualHeight - , delta - , replace - - $tip - .offset(offset) - .addClass(placement) - .addClass('in') - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - replace = true - } - - if (placement == 'bottom' || placement == 'top') { - delta = 0 - - if (offset.left < 0){ - delta = offset.left * -2 - offset.left = 0 - $tip.offset(offset) - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - , replaceArrow: function(delta, dimension, position){ - this - .arrow() - .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - , e = $.Event('hide') - - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).detach() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.detach() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.detach() - - this.$element.trigger('hidden') - - return this - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth - , height: el.offsetHeight - }, this.$element.offset()) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , arrow: function(){ - return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function (e) { - var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this - self.tip().hasClass('in') ? self.hide() : self.show() - } - - , destroy: function () { - this.hide().$element.off('.' + this.type).removeData(this.type) - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - var old = $.fn.tooltip - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover focus' - , title: '' - , delay: 0 - , html: false - , container: false - } - - - /* TOOLTIP NO CONFLICT - * =================== */ - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(window.jQuery); -/* =========================================================== - * bootstrap-popover.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#popovers - * =========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - || $e.attr('data-content') - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - , destroy: function () { - this.hide().$element.off('.' + this.type).removeData(this.type) - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.popover - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , trigger: 'click' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - /* POPOVER NO CONFLICT - * =================== */ - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(window.jQuery); -/* ============================================================= - * bootstrap-scrollspy.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#scrollspy - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy(element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && $href.length - && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY NO CONFLICT - * ===================== */ - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(window).on('load', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery);/* ======================================================== - * bootstrap-tab.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#tabs - * ======================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function (element) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active:last a')[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - var old = $.fn.tab - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB NO CONFLICT - * =============== */ - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - /* TAB DATA-API - * ============ */ - - $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-typeahead.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#typeahead - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.source = this.options.source - this.$menu = $(this.options.menu) - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.position(), { - height: this.$element[0].offsetHeight - }) - - this.$menu - .insertAfter(this.$element) - .css({ - top: pos.top + pos.height - , left: pos.left - }) - .show() - - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var items - - this.query = this.$element.val() - - if (!this.query || this.query.length < this.options.minLength) { - return this.shown ? this.hide() : this - } - - items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source - - return items ? this.process(items) : this - } - - , process: function (items) { - var that = this - - items = $.grep(items, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('focus', $.proxy(this.focus, this)) - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if (this.eventSupported('keydown')) { - this.$element.on('keydown', $.proxy(this.keydown, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) - } - - , eventSupported: function(eventName) { - var isSupported = eventName in this.$element - if (!isSupported) { - this.$element.setAttribute(eventName, 'return;') - isSupported = typeof this.$element[eventName] === 'function' - } - return isSupported - } - - , move: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - e.preventDefault() - this.prev() - break - - case 40: // down arrow - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , keydown: function (e) { - this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) - this.move(e) - } - - , keypress: function (e) { - if (this.suppressKeyPressRepeat) return - this.move(e) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - case 16: // shift - case 17: // ctrl - case 18: // alt - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , focus: function (e) { - this.focused = true - } - - , blur: function (e) { - this.focused = false - if (!this.mousedover && this.shown) this.hide() - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - this.$element.focus() - } - - , mouseenter: function (e) { - this.mousedover = true - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - , mouseleave: function (e) { - this.mousedover = false - if (!this.focused && this.shown) this.hide() - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.typeahead - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - , minLength: 1 - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD NO CONFLICT - * =================== */ - - $.fn.typeahead.noConflict = function () { - $.fn.typeahead = old - return this - } - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - $this.typeahead($this.data()) - }) - -}(window.jQuery); -/* ========================================================== - * bootstrap-affix.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#affix - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* AFFIX CLASS DEFINITION - * ====================== */ - - var Affix = function (element, options) { - this.options = $.extend({}, $.fn.affix.defaults, options) - this.$window = $(window) - .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) - this.$element = $(element) - this.checkPosition() - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - , scrollTop = this.$window.scrollTop() - , position = this.$element.offset() - , offset = this.options.offset - , offsetBottom = offset.bottom - , offsetTop = offset.top - , reset = 'affix affix-top affix-bottom' - , affix - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? - false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? - 'bottom' : offsetTop != null && scrollTop <= offsetTop ? - 'top' : false - - if (this.affixed === affix) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) - } - - - /* AFFIX PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('affix') - , options = typeof option == 'object' && option - if (!data) $this.data('affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - $.fn.affix.defaults = { - offset: 0 - } - - - /* AFFIX NO CONFLICT - * ================= */ - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - /* AFFIX DATA-API - * ============== */ - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - , data = $spy.data() - - data.offset = data.offset || {} - - data.offsetBottom && (data.offset.bottom = data.offsetBottom) - data.offsetTop && (data.offset.top = data.offsetTop) - - $spy.affix(data) - }) - }) - - -}(window.jQuery); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.min.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.min.js deleted file mode 100644 index 848258d380765521a1fc4c58e95d577ff6541745..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -* Bootstrap.js by @fat & @mdo -* Copyright 2013 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/chemical-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/chemical-browser.html deleted file mode 100644 index bf4586294b3b3d1053a6480bb122ea46b82f8022..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/chemical-browser.html +++ /dev/null @@ -1,571 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All chemicals -var chemicals = null; - -/// The chemicals that are currently being inspected -var inspectedChemicals = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - -/** Initialize the chemicals variable */ -function initializeChemicals(result) -{ - // Split the chemicals into two groups, the ones that start with FRC in their sample name and the other ones. - var frcChemicals = [], otherChemicals = []; - var frcRegex = /^FRC[0-9]+/; - frcRegex.compile(frcRegex); - result.forEach(function(sample) { - if (frcRegex.test(sample.code)) { - frcChemicals.push(sample); - } else { - otherChemicals.push(sample); - } - }); - - // Sort each of the groups - otherChemicals.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frcChemicals.sort(function(a, b) { - // Sort based on the FRC number - var frcNumberA = parseInt(a.code.substring(3)); - var frcNumberB = parseInt(b.code.substring(3)); - return (frcNumberA < frcNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of chemicals - chemicals = frcChemicals.concat(otherChemicals); -} - -/** Set the size of the chemical-table based on whether or not inspectors are visible */ -function resizeChemicalTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - if (inspectedChemicals.length > 0) { - cellWidth = "100%"; - areInspectorsVisible = false; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var chemicalTableTransition = d3.selectAll('div.chemical-table-data-cell'); - chemicalTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectChemical(chemical) -{ - if (inspectedChemicals.indexOf(chemical) < 0) { - inspectedChemicals.push(chemical); - openbisServer.listDataSetsForSample(chemical, true, dataset.curry(chemical)); - } - resizeChemicalTable(); - updateInspectors(1000); -} - -function closeInspector(chemical) -{ - var index = inspectedChemicals.indexOf(chemical); - if (index < 0) { - return; - } - - inspectedChemicals.splice(index, 1); - resizeChemicalTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedChemicals, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -/* - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - -*/ -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeChemicals(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (chemicals.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#chemical-table").selectAll("tr.chemical-table-data").data(chemicals); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "chemical-table-data") - .attr("permId", function(sample){ return sample.permId }) - .on("click", inspectChemical) - .selectAll("td").data(function(sample) { - var tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.LOCAL_ID, sample.properties.STORAGE]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "chemical-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function chemicalFilter(filter, property, element, index, array) { - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(nameFilterText, supplierFilterText, artnumFilterText, locidFilterText, storageFilterText) -{ - if (nameFilterText == undefined) - { - nameFilterText = ""; - } - - if (supplierFilterText == undefined) - { - supplierFilterText = ""; - } - - if (artnumFilterText == undefined) - { - artnumFilterText = ""; - } - - if (locidFilterText == undefined) - { - locidFilterText = ""; - } - - if (storageFilterText == undefined) - { - storageFilterText = ""; - } - - - - var displayedChemicals = chemicals.filter(chemicalFilter.curry(nameFilterText, "NAME")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(supplierFilterText, "SUPPLIER")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(artnumFilterText, "ARTICLE_NUMBER")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(locidFilterText, "LOCAL_ID")); - displayedChemicals = displayedChemicals.filter(chemicalFilter.curry(storageFilterText, "STORAGE")); - - - - - var selection2 = d3.select("#vis").select("#chemical-table").selectAll("tr.chemical-table-data").data(chemicals); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedChemicals) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "CHEMICAL" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamples(sampleCriteria, displayReturnedSamples); - -} - - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#name_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#supplier_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#artnum_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - $('#locid_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - - $('#storage_filter').keyup(function() { - visualize($('#name_filter').val(), $('#supplier_filter').val(), $('#artnum_filter').val(), $('#locid_filter').val(), $('#storage_filter').val()); - }); - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - -</script> - -</head> -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Chemicals</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered"> - <thead> - <tr> - <td></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Chemical filter" id="name_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Supplier filter" id="supplier_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Art. Number filter" id="artnum_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Local ID filter" id="locid_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Storage filter" id="storage_filter" type="text"></td> - </tr> - <tr class="chemical-table-header"><th>Code</th><th>Name</th><th>Supplier</th><th>Art. Number</th><th>Local ID</th><th>Storage</th><th></th></tr> - </thead> - <tbody id='chemical-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/css/style.css b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/css/style.css deleted file mode 100644 index bef570b1848dbb36d9d64f083c17457915bdae3f..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/css/style.css +++ /dev/null @@ -1,53 +0,0 @@ -/* Inspector */ - -div.inspector { - font: 10px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; - font-weight: normal; -} - -.properties { - padding-top:10px; - width: 100%; -} - -.properties td:nth-child(odd) { - background-color:#DDDDDD; - width:50%; -} - -.properties td:nth-child(even) { - background-color:#fbfbfb; - width:70%; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color:#DDDDDD;; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/enzyme-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/enzyme-browser.html deleted file mode 100644 index 5ae526e3065e5930a4b23d8eaa50d2a8b723763d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/enzyme-browser.html +++ /dev/null @@ -1,799 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Enzymes</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="enzyme-table-header"><th>Code</th><th>Name</th><th>Supplier</th><th>Art. Number</th><th>Kit Including</th><th></th></tr> - </thead> - <tbody id='enzyme-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All enzymes -var enzymes = null; - -/// The enzymes that are currently being inspected -var inspectedenzymes = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - enzyme = objectOrId; - } else { - enzyme = enzymesById[objectOrId]; - } - - return enzyme; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the enzymes variable */ -function initializeenzymes(result) -{ - // Construct a map of all enzymes by id - enzymesById = {}; - - // Split the enzymes into two groups, the ones that start with FRP in their sample name and the other ones. - var frpenzymes = [], otherenzymes = []; - var frpRegex = /^FRE[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - enzymesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the enzymesById map - theSample = enzymesById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpenzymes.push(theSample); - } else { - otherenzymes.push(theSample); - } - }); - - // Sort each of the groups - otherenzymes.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpenzymes.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(4)); - var frpNumberB = parseInt(b.code.substring(4)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of enzymes - enzymes = frpenzymes.concat(otherenzymes); -} - - - -/** Set the size of the enzyme-table based on whether or not inspectors are visible */ -function resizeenzymeTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var enzymeTableTransition = d3.selectAll('div.enzyme-table-data-cell'); - enzymeTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectenzyme(enzyme) -{ - if (inspectedenzymes.indexOf(enzyme) < 0) { - inspectedenzymes.push(enzyme); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var enzymeToSend = $.extend({}, enzyme); - delete enzymeToSend.parents; - delete enzymeToSend.children; - openbisServer.listDataSetsForSample(enzymeToSend, true, dataset.curry(enzyme)); - } - resizeenzymeTable(); - updateInspectors(1000); -} - -function closeInspector(enzyme) -{ - var index = inspectedenzymes.indexOf(enzyme); - if (index < 0) { - return; - } - - inspectedenzymes.splice(index, 1); - resizeenzymeTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedenzymes, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectenzyme(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectenzyme(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeenzymes(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (enzymes.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzymes); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "enzyme-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectenzyme) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.SUPPLIER, sample.properties.ARTICLE_NUMBER, sample.properties.KIT]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "enzyme-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function enzymeFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, enzymeNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (enzymeNameFilterText == undefined) - { - enzymeNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedenzymes = enzymes.filter(enzymeFilter.curry(ownerFilterText, "OWNER")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(enzymeNameFilterText, "ENZYME_NAME")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(backboneFilterText, "BACKBONE")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedenzymes = displayedenzymes.filter(enzymeFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#enzyme-table").selectAll("tr.enzyme-table-data").data(enzymes); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedenzymes) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "ENZYME" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#enzymeName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#enzymeName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/general_protocol-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/general_protocol-browser.html deleted file mode 100644 index a8b0e4de919cce733f2a36c8dc60b2f088e6f2bf..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/general_protocol-browser.html +++ /dev/null @@ -1,1060 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">General Protocols</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; overflow: auto;"> - <table style="float: left" class="table table-striped table-bordered table-hover"> - <thead> - <tr class="protocol-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Protocol Type</th><th>Publication</th><th></th></tr> - </thead> - <tbody id='protocol-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - - </div> - </div> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All protocol -var protocols = null; - -/// The protocol that are currently being inspected -var inspectedprotocols = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - var protocolValue = sample.properties.GENERAL_PROTOCOL; - sample.properties.GENERAL_PROTOCOL_PARENTS = []; - - if (!xmlValueRegex.test(protocolValue)) - return; - - globalValue =protocolValue; - var protocolXml = xmlParser.parseFromString(protocolValue, "text/xml"); - - - for (i=1; i < protocolXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = protocolXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("quantity") != null) { - var quantity = sampleNode.attributes.getNamedItem("quantity").value; - } - else{ - var quantity = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var GENERAL_PROTOCOL_PARENTS = null; - - - GENERAL_PROTOCOL_PARENTS = "\n\n " +code + "(" + name + ")" + quantity ; - - - - sample.properties.GENERAL_PROTOCOL_PARENTS.push(GENERAL_PROTOCOL_PARENTS); - - - } - - -} - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION", "DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS", "GENERAL_PROTOCOL_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - protocol = objectOrId; - } else { - protocol = protocolsById[objectOrId]; - } - - return protocol; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the protocols variable */ -function initializeprotocols(result) -{ - // Construct a map of all protocols by id - protocolsById = {}; - - // Split the protocols into two groups, the ones that start with FRP in their sample name and the other ones. - var frpprotocols = [], otherprotocols = []; - var frpRegex = /^FRPROT[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - protocolsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the protocolsById map - theSample = protocolsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpprotocols.push(theSample); - } else { - otherprotocols.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherprotocols.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpprotocols.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of protocols - protocols = frpprotocols.concat(otherprotocols); -} - - - - -/** Set the size of the protocol-table based on whether or not inspectors are visible */ -function resizeprotocolTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var protocolTableTransition = d3.selectAll('div.protocol-table-data-cell'); - protocolTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectprotocol(protocol) -{ - if (inspectedprotocols.indexOf(protocol) < 0) { - inspectedprotocols.push(protocol); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var protocolToSend = $.extend({}, protocol); - delete protocolToSend.parents; - delete protocolToSend.children; - - } - resizeprotocolTable(); - updateInspectors(1000); -} - -function closeInspector(protocol) -{ - var index = inspectedprotocols.indexOf(protocol); - if (index < 0) { - return; - } - - inspectedprotocols.splice(index, 1); - resizeprotocolTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedprotocols, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectprotocol(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectprotocol(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeprotocols(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (protocols.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#protocol-table").selectAll("tr.protocol-table-data").data(protocols); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "protocol-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectprotocol) - .selectAll("td").data(function(sample) { - var tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.PROTOCOL_TYPE, sample.properties.PUBLICATION]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "protocol-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function protocolFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#protocol-table").selectAll("tr.protocol-table-data").data(protocols); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedprotocols) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "GENERAL_PROTOCOL" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-chrome.png b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-chrome.png deleted file mode 100644 index 8c846c54e0d623fab50aac814ba547b5f621c9cc..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-chrome.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-firefox.png b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-firefox.png deleted file mode 100644 index 3dd68b11335ed2a0c5554335980a0ab4b51c8747..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/browser-icon-firefox.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png deleted file mode 100644 index 87ae5e81899908f3968ea230205322dc19ff4ee5..0000000000000000000000000000000000000000 Binary files a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/images/openBIS_Logo.png and /dev/null differ diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/index.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/index.html deleted file mode 100644 index c4354285a057bcb690a8c36ad5e7be58136dd2b2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/index.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta HTTP-EQUIV="REFRESH" content="0; url=search-browser.html"> -</head> -<body> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/common.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/common.js deleted file mode 100644 index c3fe7944bfd7c34db8c1b927168ba74608ea1973..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/common.js +++ /dev/null @@ -1,122 +0,0 @@ -var openbisUrl = 'https://localhost:8443/'; -var dssUrl = 'https://localhost:8444/datastore_server'; - -function dataset(sample, data) { - if(data.result){ - for (var i = 0; i < data.result.length; i++) { - console.log(data.result) - openbisServer.listFilesForDataSet(data.result[i].code, "/", true, filelist.curry(sample, data.result[i])); - } - } -} - -function filelist(sample, dataset, files) { - for (var i in files.result) { - if (!files.result[i].isDirectory) { - var inspector = inspectors.select("#"+sample.code+"_INSPECTOR"); - var pathInDataSet = files.result[i].pathInDataSet; - - if(pathInDataSet){ - var downloadUrl = dssUrl+"/"+dataset.code+"/"+pathInDataSet+"?sessionID=" + openbisServer.getSession(); - inspector.select("td.data_sets").append("a").attr("href", downloadUrl).text(pathInDataSet) - inspector.select("td.data_sets").append("br"); - - if (/\.svg$/.test(pathInDataSet)) { - // Retrieve the svg file and inject it into the DOM - d3.xml(downloadUrl, "image/svg+xml", function(xml) { - var importedNode = document.importNode(xml.documentElement, true); - d3.select(importedNode) - .attr("width", inspectorsWidth - 20) - .attr("height", inspectorsWidth - 20) - .attr("viewBox", "200 200 650 650"); - inspector.node().appendChild(importedNode); - }); - } - } - } - } -} - -// -// UI Related -// - -function createTableFromProperties() { - var tableTemplate = "<table style='width:100%' class='table table-striped table-bordered table-hover' id=\"yeast-table\"><thead>"; - - tableTemplate += "<tr style='border:none; border-collapse:collapse;'><td></td>"; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME.length;i++) { - tableTemplate += "<td style='border:none; border-collapse:collapse;'><input placeholder='"+SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME[i]+" filter' style=\"width: 90%\" id=\""+SAMPLE_TYPE_PROPERTIES[i]+"_filter\" type=\"text\"></td>"; - } - tableTemplate += "</tr>"; - - tableTemplate += "<tr class=\"yeast-table-header\"><th>Code</th>"; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME.length;i++) { - tableTemplate += "<th>" + SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME[i]+ "</th>"; - } - tableTemplate += "<th></th></tr></thead><tbody id='sample-data-holder'></tbody></table>"; - - $("#tableContainer").empty(); - $("#tableContainer").append(tableTemplate); - - for(var i=0;i<SAMPLE_TYPE_PROPERTIES.length;i++) { - $('#'+SAMPLE_TYPE_PROPERTIES[i]+'_filter').keyup(function() { - var filterResults = []; - for(var i=0;i<SAMPLE_TYPE_PROPERTIES.length;i++) { - filterResults[i] = $('#'+SAMPLE_TYPE_PROPERTIES[i]+'_filter').val(); - } - - visualize( - filterResults - ); - }); - } -} - -function populateMenuNew() { - - var menu = ""; - menu += "<span id='button-group'> <button class='btn' id='logout-button' style='position: absolute; right:10px; top:10px;'>Logout</button> </span>"; - menu += "<center>"; - menu += "<span id='search_browser'> <a style='width:110px; margin:5px;' class='btn' href='search-browser.html'>Search</a> </span>"; - menu += "<span id='bacteria_browser'> <a style='width:110px; margin:5px;' class='btn' href='bacteria-browser.html'>Bacteria</a> </span>"; - menu += "<span id='chemical_browser'> <a style='width:110px; margin:5px;' class='btn' href='chemical-browser.html'>Chemicals</a> </span>"; - menu += "<span id='antibody_browser'> <a style='width:110px; margin:5px;' class='btn' href='antibody-browser.html'>Antibodies</a> </span>"; - menu += "<span id='media_browser'> <a style='width:110px; margin:5px;' class='btn' href='media-browser.html'>Media</a> </span>"; - menu += "<span id='buffer_browser'> <a style='width:110px; margin:5px;' class='btn' href='solutions_buffers-browser.html'>Solutions Buffers</a> </span>"; - menu += "<span id='enzyme_browser'> <a style='width:110px; margin:5px;' class='btn' href='enzyme-browser.html'>Enzymes</a> </span>"; - menu += "<span id='oligo_browser'> <a style='width:110px; margin:5px;' class='btn' href='oligo-browser.html'>Oligos</a> </span>"; - menu += "<span id='plasmid_browser'> <a style='width:110px; margin:5px;' class='btn' href='plasmid-browser.html'>Plasmids</a> </span>"; - menu += "<span id='yeast_browser'> <a style='width:110px; margin:5px;' class='btn' href='yeast-browser.html'>Yeasts</a> </span>"; - menu += "<span id='protocol_browser'> <a style='width:110px; margin:5px;' class='btn' href='general_protocol-browser.html'>Protocols</a> </span>"; - menu += "<span id='pcr_browser'> <a style='width:110px; margin:5px;' class='btn' href='pcr-browser.html'>PCR</a> </span>"; - menu += "<span id='western_blotting_browser'> <a style='width:110px; margin:5px;' class='btn' href='western_blotting-browser.html'>Western Blotting</a> </span>"; - menu += "</center>"; - - $("#sectionsContainer").empty(); - $("#sectionsContainer").append(menu); - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); -} - -function showEditWindowForSample(code, permId) { - //Add iframe -// if ($("#editFrame").length == 0){ -// $('#containerForIframe').append("<iframe style='width:800px; height:500px;' id='editFrame'></iframe>"); -// } - - //Load iframe content - //Working Example: https://sprint-openbis.ethz.ch/openbis/?viewMode=embedded#action=EDITING&entity=SAMPLE&code=A123&permId=20091006093948112-162773 - var editURLTemplate = openbisUrl + "openbis/?viewMode=embedded#action=EDITING&entity=SAMPLE"; - var codeParam = "&code="+code; - var permId = "&permId="+permId; - var sessionId = "&sessionID="+openbisServer.getSession(); - window.open(editURLTemplate+codeParam+permId+sessionId,'Edit Sample',null); - //$('#editFrame').attr('src', editURLTemplate+codeParam+permId); -} \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.js deleted file mode 100755 index 13abb6dbc6f9665c005209b8e09d0dc97266d1f7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.layout.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.layout.js deleted file mode 100755 index 6cc1d7161677597ae7f718a4c0cafb90a240a56a..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.time.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.tsv.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.tsv.js deleted file mode 100644 index 8d9a5e4f7038bfe558e2cca878854d234b770b8d..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/d3.tsv.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * TSV Parser from: - * https://github.com/vlandham/d3.tsv - */ -(function(){d3.tsv = function(url, callback) { - d3.text(url, "text/tab-separated-values", function(text) { - callback(text && d3.tsv.parse(text, "\t")); - }); -}; - -d3.tsv.version = "0.0.2" -d3.tsv.parse = function(text, separator) { - var header; - return separator && d3.tsv.parseRows(text, separator, function(row, i) { - if (i) { - var o = {}, j = -1, m = header.length; - while (++j < m) o[header[j]] = row[j]; - return o; - } else { - header = row; - return null; - } - }); -}; - -d3.tsv.parseRows = function(text, separator, f) { - var EOL = {}, // sentinel value for end-of-line - EOF = {}, // sentinel value for end-of-file - rows = [], // output rows - re = new RegExp("\r\n|[" + separator + "\r\n]", "g"), // field separator regex - separatorCode = separator.charCodeAt(0), // code to match separator with - n = 0, // the current line number - t, // the current token - eol; // is the current token followed by EOL? - - re.lastIndex = 0; // work-around bug in FF 3.6 - - /** @private Returns the next token. */ - function token() { - if (re.lastIndex >= text.length) return EOF; // special case: end of file - if (eol) { eol = false; return EOL; } // special case: end of line - - // special case: quotes - var j = re.lastIndex; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < text.length) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - i++; - } - } - re.lastIndex = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) re.lastIndex++; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, "\""); - } - - // common case - var m = re.exec(text); - if (m) { - eol = m[0].charCodeAt(0) !== separatorCode; - return text.substring(j, m.index); - } - re.lastIndex = text.length; - return text.substring(j); - } - - while ((t = token()) !== EOF) { - var a = []; - while ((t !== EOL) && (t !== EOF)) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - - return rows; -}; -d3.tsv.format = function(rows) { - return rows.map(function (row) { - return d3_formatRow(row, "\t"); - }).join("\n"); -}; - -function d3_formatRow(row, separator) { - return row.map(d3_formatValue).join(separator); -} - -function d3_formatValue(text) { - return /[",\n]/.test(text) - ? "\"" + text.replace(/\"/g, "\"\"") + "\"" - : text; -} -})(); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/infra.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/infra.js deleted file mode 100644 index c292b17ec147d3eeddc2f649802a0b0d64f18148..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/infra.js +++ /dev/null @@ -1,70 +0,0 @@ -if (!Array.prototype.filter) -{ - Array.prototype.filter = function(fun /*, thisp*/) - { - var len = this.length; - if (typeof fun != "function") - throw new TypeError(); - - var res = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) - { - if (i in this) - { - var val = this[i]; // in case fun mutates this - if (fun.call(thisp, val, i, this)) - res.push(val); - } - } - - return res; - }; -} - -if (!Array.prototype.search) -{ - Array.prototype.search = function(fun /*, thisp*/) - { - var len2 = this.length; - if (typeof fun != "function") - throw new TypeError(); - - var res2 = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len2; i++) - { - if (i in this) - { - var val2 = this[i]; // in case fun mutates this - if (fun.call(thisp, val2, i, this)) - res2.push(val2); - } - } - - return res2; - }; -} - -if (!Function.prototype.curry) -{ - (function () - { - var slice = Array.prototype.slice; - Function.prototype.curry = function () - { - var target = this; - var args = slice.call(arguments); - return function () - { - var allArgs = args; - if (arguments.length > 0) - { - allArgs = args.concat(slice.call(arguments)); - } - return target.apply(this, allArgs); - }; - }; - }()) -}; - diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.dataTables.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.dataTables.js deleted file mode 100644 index ae5d1750d90c90f197ff742d72c3ce5da3efa0b0..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.dataTables.js +++ /dev/null @@ -1,11863 +0,0 @@ -/** - * @summary DataTables - * @description Paginate, search and sort HTML tables - * @version 1.9.2 - * @file jquery.dataTables.js - * @author Allan Jardine (www.sprymedia.co.uk) - * @contact www.sprymedia.co.uk/contact - * - * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved. - * - * This source file is free software, under either the GPL v2 license or a - * BSD style license, available at: - * http://datatables.net/license_gpl2 - * http://datatables.net/license_bsd - * - * This source file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - * - * For details please refer to: http://www.datatables.net - */ - -/*jslint evil: true, undef: true, browser: true */ -/*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros*/ - -(/** @lends <global> */function($, window, document, undefined) { - /** - * DataTables is a plug-in for the jQuery Javascript library. It is a - * highly flexible tool, based upon the foundations of progressive - * enhancement, which will add advanced interaction controls to any - * HTML table. For a full list of features please refer to - * <a href="http://datatables.net">DataTables.net</a>. - * - * Note that the <i>DataTable</i> object is not a global variable but is - * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which - * it may be accessed. - * - * @class - * @param {object} [oInit={}] Configuration object for DataTables. Options - * are defined by {@link DataTable.defaults} - * @requires jQuery 1.3+ - * - * @example - * // Basic initialisation - * $(document).ready( function { - * $('#example').dataTable(); - * } ); - * - * @example - * // Initialisation with configuration options - in this case, disable - * // pagination and sorting. - * $(document).ready( function { - * $('#example').dataTable( { - * "bPaginate": false, - * "bSort": false - * } ); - * } ); - */ - var DataTable = function( oInit ) - { - - - /** - * Add a column to the list used for the table with default values - * @param {object} oSettings dataTables settings object - * @param {node} nTh The th element for this column - * @memberof DataTable#oApi - */ - function _fnAddColumn( oSettings, nTh ) - { - var oDefaults = DataTable.defaults.columns; - var iCol = oSettings.aoColumns.length; - var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { - "sSortingClass": oSettings.oClasses.sSortable, - "sSortingClassJUI": oSettings.oClasses.sSortJUI, - "nTh": nTh ? nTh : document.createElement('th'), - "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', - "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], - "mDataProp": oDefaults.mDataProp ? oDefaults.oDefaults : iCol - } ); - oSettings.aoColumns.push( oCol ); - - /* Add a column specific filter */ - if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) - { - oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); - } - else - { - var oPre = oSettings.aoPreSearchCols[ iCol ]; - - /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ - if ( oPre.bRegex === undefined ) - { - oPre.bRegex = true; - } - - if ( oPre.bSmart === undefined ) - { - oPre.bSmart = true; - } - - if ( oPre.bCaseInsensitive === undefined ) - { - oPre.bCaseInsensitive = true; - } - } - - /* Use the column options function to initialise classes etc */ - _fnColumnOptions( oSettings, iCol, null ); - } - - - /** - * Apply options for a column - * @param {object} oSettings dataTables settings object - * @param {int} iCol column index to consider - * @param {object} oOptions object with sType, bVisible and bSearchable - * @memberof DataTable#oApi - */ - function _fnColumnOptions( oSettings, iCol, oOptions ) - { - var oCol = oSettings.aoColumns[ iCol ]; - - /* User specified column options */ - if ( oOptions !== undefined && oOptions !== null ) - { - if ( oOptions.sType !== undefined ) - { - oCol.sType = oOptions.sType; - oCol._bAutoType = false; - } - - $.extend( oCol, oOptions ); - _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); - - /* iDataSort to be applied (backwards compatibility), but aDataSort will take - * priority if defined - */ - if ( oOptions.iDataSort !== undefined ) - { - oCol.aDataSort = [ oOptions.iDataSort ]; - } - _fnMap( oCol, oOptions, "aDataSort" ); - } - - /* Cache the data get and set functions for speed */ - oCol.fnGetData = _fnGetObjectDataFn( oCol.mDataProp ); - oCol.fnSetData = _fnSetObjectDataFn( oCol.mDataProp ); - - /* Feature sorting overrides column specific when off */ - if ( !oSettings.oFeatures.bSort ) - { - oCol.bSortable = false; - } - - /* Check that the class assignment is correct for sorting */ - if ( !oCol.bSortable || - ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableNone; - oCol.sSortingClassJUI = ""; - } - else if ( oCol.bSortable || - ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) - { - oCol.sSortingClass = oSettings.oClasses.sSortable; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; - } - else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableAsc; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; - } - else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) - { - oCol.sSortingClass = oSettings.oClasses.sSortableDesc; - oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; - } - } - - - /** - * Adjust the table column widths for new data. Note: you would probably want to - * do a redraw after calling this function! - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAdjustColumnSizing ( oSettings ) - { - /* Not interested in doing column width calculation if autowidth is disabled */ - if ( oSettings.oFeatures.bAutoWidth === false ) - { - return false; - } - - _fnCalculateColumnWidths( oSettings ); - for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth; - } - } - - - /** - * Covert the index of a visible column to the index in the data array (take account - * of hidden columns) - * @param {object} oSettings dataTables settings object - * @param {int} iMatch Visible column index to lookup - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnVisibleToColumnIndex( oSettings, iMatch ) - { - var iColumn = -1; - - for ( var i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === true ) - { - iColumn++; - } - - if ( iColumn == iMatch ) - { - return i; - } - } - - return null; - } - - - /** - * Covert the index of an index in the data array and convert it to the visible - * column index (take account of hidden columns) - * @param {int} iMatch Column index to lookup - * @param {object} oSettings dataTables settings object - * @returns {int} i the data index - * @memberof DataTable#oApi - */ - function _fnColumnIndexToVisible( oSettings, iMatch ) - { - var iVisible = -1; - for ( var i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === true ) - { - iVisible++; - } - - if ( i == iMatch ) - { - return oSettings.aoColumns[i].bVisible === true ? iVisible : null; - } - } - - return null; - } - - - /** - * Get the number of visible columns - * @returns {int} i the number of visible columns - * @param {object} oS dataTables settings object - * @memberof DataTable#oApi - */ - function _fnVisbleColumns( oS ) - { - var iVis = 0; - for ( var i=0 ; i<oS.aoColumns.length ; i++ ) - { - if ( oS.aoColumns[i].bVisible === true ) - { - iVis++; - } - } - return iVis; - } - - - /** - * Get the sort type based on an input string - * @param {string} sData data we wish to know the type of - * @returns {string} type (defaults to 'string' if no type can be detected) - * @memberof DataTable#oApi - */ - function _fnDetectType( sData ) - { - var aTypes = DataTable.ext.aTypes; - var iLen = aTypes.length; - - for ( var i=0 ; i<iLen ; i++ ) - { - var sType = aTypes[i]( sData ); - if ( sType !== null ) - { - return sType; - } - } - - return 'string'; - } - - - /** - * Figure out how to reorder a display list - * @param {object} oSettings dataTables settings object - * @returns array {int} aiReturn index list for reordering - * @memberof DataTable#oApi - */ - function _fnReOrderIndex ( oSettings, sColumns ) - { - var aColumns = sColumns.split(','); - var aiReturn = []; - - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - for ( var j=0 ; j<iLen ; j++ ) - { - if ( oSettings.aoColumns[i].sName == aColumns[j] ) - { - aiReturn.push( j ); - break; - } - } - } - - return aiReturn; - } - - - /** - * Get the column ordering that DataTables expects - * @param {object} oSettings dataTables settings object - * @returns {string} comma separated list of names - * @memberof DataTable#oApi - */ - function _fnColumnOrdering ( oSettings ) - { - var sNames = ''; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - sNames += oSettings.aoColumns[i].sName+','; - } - if ( sNames.length == iLen ) - { - return ""; - } - return sNames.slice(0, -1); - } - - - /** - * Take the column definitions and static columns arrays and calculate how - * they relate to column indexes. The callback function will then apply the - * definition found for a column to a suitable configuration object. - * @param {object} oSettings dataTables settings object - * @param {array} aoColDefs The aoColumnDefs array that is to be applied - * @param {array} aoCols The aoColumns array that defines columns individually - * @param {function} fn Callback function - takes two parameters, the calculated - * column index and the definition for that column. - * @memberof DataTable#oApi - */ - function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn ) - { - var i, iLen, j, jLen, k, kLen; - - // Column definitions with aTargets - if ( aoColDefs ) - { - /* Loop over the definitions array - loop in reverse so first instance has priority */ - for ( i=aoColDefs.length-1 ; i>=0 ; i-- ) - { - /* Each definition can target multiple columns, as it is an array */ - var aTargets = aoColDefs[i].aTargets; - if ( !$.isArray( aTargets ) ) - { - _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) ); - } - - for ( j=0, jLen=aTargets.length ; j<jLen ; j++ ) - { - if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 ) - { - /* Add columns that we don't yet know about */ - while( oSettings.aoColumns.length <= aTargets[j] ) - { - _fnAddColumn( oSettings ); - } - - /* Integer, basic index */ - fn( aTargets[j], aoColDefs[i] ); - } - else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 ) - { - /* Negative integer, right to left column counting */ - fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] ); - } - else if ( typeof aTargets[j] === 'string' ) - { - /* Class name matching on TH element */ - for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ ) - { - if ( aTargets[j] == "_all" || - $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) ) - { - fn( k, aoColDefs[i] ); - } - } - } - } - } - } - - // Statically defined columns array - if ( aoCols ) - { - for ( i=0, iLen=aoCols.length ; i<iLen ; i++ ) - { - fn( i, aoCols[i] ); - } - } - } - - - - /** - * Add a data array to the table, creating DOM node etc. This is the parallel to - * _fnGatherData, but for adding rows from a Javascript source, rather than a - * DOM source. - * @param {object} oSettings dataTables settings object - * @param {array} aData data array to be added - * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed - * @memberof DataTable#oApi - */ - function _fnAddData ( oSettings, aDataSupplied ) - { - var oCol; - - /* Take an independent copy of the data source so we can bash it about as we wish */ - var aDataIn = ($.isArray(aDataSupplied)) ? - aDataSupplied.slice() : - $.extend( true, {}, aDataSupplied ); - - /* Create the object for storing information about this new row */ - var iRow = oSettings.aoData.length; - var oData = $.extend( true, {}, DataTable.models.oRow ); - oData._aData = aDataIn; - oSettings.aoData.push( oData ); - - /* Create the cells */ - var nTd, sThisType; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oCol = oSettings.aoColumns[i]; - - /* Use rendered data for filtering/sorting */ - if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mDataProp !== null ) - { - _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) ); - } - else - { - _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) ); - } - - /* See if we should auto-detect the column type */ - if ( oCol._bAutoType && oCol.sType != 'string' ) - { - /* Attempt to auto detect the type - same as _fnGatherData() */ - var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' ); - if ( sVarType !== null && sVarType !== '' ) - { - sThisType = _fnDetectType( sVarType ); - if ( oCol.sType === null ) - { - oCol.sType = sThisType; - } - else if ( oCol.sType != sThisType && oCol.sType != "html" ) - { - /* String is always the 'fallback' option */ - oCol.sType = 'string'; - } - } - } - } - - /* Add to the display array */ - oSettings.aiDisplayMaster.push( iRow ); - - /* Create the DOM imformation */ - if ( !oSettings.oFeatures.bDeferRender ) - { - _fnCreateTr( oSettings, iRow ); - } - - return iRow; - } - - - /** - * Read in the data from the target table from the DOM - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnGatherData( oSettings ) - { - var iLoop, i, iLen, j, jLen, jInner, - nTds, nTrs, nTd, aLocalData, iThisIndex, - iRow, iRows, iColumn, iColumns, sNodeName, - oCol, oData; - - /* - * Process by row first - * Add the data object for the whole table - storing the tr node. Note - no point in getting - * DOM based data if we are going to go and replace it with Ajax source data. - */ - if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null ) - { - nTrs = oSettings.nTBody.childNodes; - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - if ( nTrs[i].nodeName.toUpperCase() == "TR" ) - { - iThisIndex = oSettings.aoData.length; - nTrs[i]._DT_RowIndex = iThisIndex; - oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, { - "nTr": nTrs[i] - } ) ); - - oSettings.aiDisplayMaster.push( iThisIndex ); - nTds = nTrs[i].childNodes; - jInner = 0; - - for ( j=0, jLen=nTds.length ; j<jLen ; j++ ) - { - sNodeName = nTds[j].nodeName.toUpperCase(); - if ( sNodeName == "TD" || sNodeName == "TH" ) - { - _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTds[j].innerHTML) ); - jInner++; - } - } - } - } - } - - /* Gather in the TD elements of the Table - note that this is basically the same as - * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet - * setup! - */ - nTrs = _fnGetTrNodes( oSettings ); - nTds = []; - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ ) - { - nTd = nTrs[i].childNodes[j]; - sNodeName = nTd.nodeName.toUpperCase(); - if ( sNodeName == "TD" || sNodeName == "TH" ) - { - nTds.push( nTd ); - } - } - } - - /* Now process by column */ - for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ ) - { - oCol = oSettings.aoColumns[iColumn]; - - /* Get the title of the column - unless there is a user set one */ - if ( oCol.sTitle === null ) - { - oCol.sTitle = oCol.nTh.innerHTML; - } - - var - bAutoType = oCol._bAutoType, - bRender = typeof oCol.fnRender === 'function', - bClass = oCol.sClass !== null, - bVisible = oCol.bVisible, - nCell, sThisType, sRendered, sValType; - - /* A single loop to rule them all (and be more efficient) */ - if ( bAutoType || bRender || bClass || !bVisible ) - { - for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ ) - { - oData = oSettings.aoData[iRow]; - nCell = nTds[ (iRow*iColumns) + iColumn ]; - - /* Type detection */ - if ( bAutoType && oCol.sType != 'string' ) - { - sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' ); - if ( sValType !== '' ) - { - sThisType = _fnDetectType( sValType ); - if ( oCol.sType === null ) - { - oCol.sType = sThisType; - } - else if ( oCol.sType != sThisType && - oCol.sType != "html" ) - { - /* String is always the 'fallback' option */ - oCol.sType = 'string'; - } - } - } - - if ( typeof oCol.mDataProp === 'function' ) - { - nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' ); - } - - /* Rendering */ - if ( bRender ) - { - sRendered = _fnRender( oSettings, iRow, iColumn ); - nCell.innerHTML = sRendered; - if ( oCol.bUseRendered ) - { - /* Use the rendered data for filtering/sorting */ - _fnSetCellData( oSettings, iRow, iColumn, sRendered ); - } - } - - /* Classes */ - if ( bClass ) - { - nCell.className += ' '+oCol.sClass; - } - - /* Column visability */ - if ( !bVisible ) - { - oData._anHidden[iColumn] = nCell; - nCell.parentNode.removeChild( nCell ); - } - else - { - oData._anHidden[iColumn] = null; - } - - if ( oCol.fnCreatedCell ) - { - oCol.fnCreatedCell.call( oSettings.oInstance, - nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn - ); - } - } - } - } - - /* Row created callbacks */ - if ( oSettings.aoRowCreatedCallback.length !== 0 ) - { - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - oData = oSettings.aoData[i]; - _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] ); - } - } - } - - - /** - * Take a TR element and convert it to an index in aoData - * @param {object} oSettings dataTables settings object - * @param {node} n the TR element to find - * @returns {int} index if the node is found, null if not - * @memberof DataTable#oApi - */ - function _fnNodeToDataIndex( oSettings, n ) - { - return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null; - } - - - /** - * Take a TD element and convert it into a column data index (not the visible index) - * @param {object} oSettings dataTables settings object - * @param {int} iRow The row number the TD/TH can be found in - * @param {node} n The TD/TH element to find - * @returns {int} index if the node is found, -1 if not - * @memberof DataTable#oApi - */ - function _fnNodeToColumnIndex( oSettings, iRow, n ) - { - var anCells = _fnGetTdNodes( oSettings, iRow ); - - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( anCells[i] === n ) - { - return i; - } - } - return -1; - } - - - /** - * Get an array of data for a given row from the internal data cache - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {string} sSpecific data get type ('type' 'filter' 'sort') - * @returns {array} Data array - * @memberof DataTable#oApi - */ - function _fnGetRowData( oSettings, iRow, sSpecific ) - { - var out = []; - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - out.push( _fnGetCellData( oSettings, iRow, i, sSpecific ) ); - } - return out; - } - - - /** - * Get the data for a given cell from the internal cache, taking into account data mapping - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {int} iCol Column index - * @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort') - * @returns {*} Cell data - * @memberof DataTable#oApi - */ - function _fnGetCellData( oSettings, iRow, iCol, sSpecific ) - { - var sData; - var oCol = oSettings.aoColumns[iCol]; - var oData = oSettings.aoData[iRow]._aData; - - if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined ) - { - if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null ) - { - _fnLog( oSettings, 0, "Requested unknown parameter "+ - (typeof oCol.mDataProp=='function' ? '{mDataprop function}' : "'"+oCol.mDataProp+"'")+ - " from the data source for row "+iRow ); - oSettings.iDrawError = oSettings.iDraw; - } - return oCol.sDefaultContent; - } - - /* When the data source is null, we can use default column data */ - if ( sData === null && oCol.sDefaultContent !== null ) - { - sData = oCol.sDefaultContent; - } - else if ( typeof sData === 'function' ) - { - /* If the data source is a function, then we run it and use the return */ - return sData(); - } - - if ( sSpecific == 'display' && sData === null ) - { - return ''; - } - return sData; - } - - - /** - * Set the value for a specific cell, into the internal data cache - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData row id - * @param {int} iCol Column index - * @param {*} val Value to set - * @memberof DataTable#oApi - */ - function _fnSetCellData( oSettings, iRow, iCol, val ) - { - var oCol = oSettings.aoColumns[iCol]; - var oData = oSettings.aoData[iRow]._aData; - - oCol.fnSetData( oData, val ); - } - - - /** - * Return a function that can be used to get data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data get function - * @memberof DataTable#oApi - */ - function _fnGetObjectDataFn( mSource ) - { - if ( mSource === null ) - { - /* Give an empty string for rendering / sorting etc */ - return function (data, type) { - return null; - }; - } - else if ( typeof mSource === 'function' ) - { - return function (data, type) { - return mSource( data, type ); - }; - } - else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 ) - { - /* If there is a . in the source string then the data source is in a - * nested object so we loop over the data for each level to get the next - * level down. On each loop we test for undefined, and if found immediatly - * return. This allows entire objects to be missing and sDefaultContent to - * be used if defined, rather than throwing an error - */ - var a = mSource.split('.'); - return function (data, type) { - for ( var i=0, iLen=a.length ; i<iLen ; i++ ) - { - data = data[ a[i] ]; - if ( data === undefined ) - { - return undefined; - } - } - return data; - }; - } - else - { - /* Array or flat object mapping */ - return function (data, type) { - return data[mSource]; - }; - } - } - - - /** - * Return a function that can be used to set data from a source object, taking - * into account the ability to use nested objects as a source - * @param {string|int|function} mSource The data source for the object - * @returns {function} Data set function - * @memberof DataTable#oApi - */ - function _fnSetObjectDataFn( mSource ) - { - if ( mSource === null ) - { - /* Nothing to do when the data source is null */ - return function (data, val) {}; - } - else if ( typeof mSource === 'function' ) - { - return function (data, val) { - mSource( data, 'set', val ); - }; - } - else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 ) - { - /* Like the get, we need to get data from a nested object. */ - var a = mSource.split('.'); - return function (data, val) { - for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) - { - // If the nested object doesn't currently exist - since we are - // trying to set the value - create it - if ( data[ a[i] ] === undefined ) - { - data[ a[i] ] = {}; - } - data = data[ a[i] ]; - } - data[ a[a.length-1] ] = val; - }; - } - else - { - /* Array or flat object mapping */ - return function (data, val) { - data[mSource] = val; - }; - } - } - - - /** - * Return an array with the full table data - * @param {object} oSettings dataTables settings object - * @returns array {array} aData Master data array - * @memberof DataTable#oApi - */ - function _fnGetDataMaster ( oSettings ) - { - var aData = []; - var iLen = oSettings.aoData.length; - for ( var i=0 ; i<iLen; i++ ) - { - aData.push( oSettings.aoData[i]._aData ); - } - return aData; - } - - - /** - * Nuke the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnClearTable( oSettings ) - { - oSettings.aoData.splice( 0, oSettings.aoData.length ); - oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length ); - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length ); - _fnCalculateEnd( oSettings ); - } - - - /** - * Take an array of integers (index array) and remove a target integer (value - not - * the key!) - * @param {array} a Index array to target - * @param {int} iTarget value to find - * @memberof DataTable#oApi - */ - function _fnDeleteIndex( a, iTarget ) - { - var iTargetIndex = -1; - - for ( var i=0, iLen=a.length ; i<iLen ; i++ ) - { - if ( a[i] == iTarget ) - { - iTargetIndex = i; - } - else if ( a[i] > iTarget ) - { - a[i]--; - } - } - - if ( iTargetIndex != -1 ) - { - a.splice( iTargetIndex, 1 ); - } - } - - - /** - * Call the developer defined fnRender function for a given cell (row/column) with - * the required parameters and return the result. - * @param {object} oSettings dataTables settings object - * @param {int} iRow aoData index for the row - * @param {int} iCol aoColumns index for the column - * @returns {*} Return of the developer's fnRender function - * @memberof DataTable#oApi - */ - function _fnRender( oSettings, iRow, iCol ) - { - var oCol = oSettings.aoColumns[iCol]; - - return oCol.fnRender( { - "iDataRow": iRow, - "iDataColumn": iCol, - "oSettings": oSettings, - "aData": oSettings.aoData[iRow]._aData, - "mDataProp": oCol.mDataProp - }, _fnGetCellData(oSettings, iRow, iCol, 'display') ); - } - - /** - * Create a new TR element (and it's TD children) for a row - * @param {object} oSettings dataTables settings object - * @param {int} iRow Row to consider - * @memberof DataTable#oApi - */ - function _fnCreateTr ( oSettings, iRow ) - { - var oData = oSettings.aoData[iRow]; - var nTd; - - if ( oData.nTr === null ) - { - oData.nTr = document.createElement('tr'); - - /* Use a private property on the node to allow reserve mapping from the node - * to the aoData array for fast look up - */ - oData.nTr._DT_RowIndex = iRow; - - /* Special parameters can be given by the data source to be used on the row */ - if ( oData._aData.DT_RowId ) - { - oData.nTr.id = oData._aData.DT_RowId; - } - - if ( oData._aData.DT_RowClass ) - { - $(oData.nTr).addClass( oData._aData.DT_RowClass ); - } - - /* Process each column */ - for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - var oCol = oSettings.aoColumns[i]; - nTd = document.createElement( oCol.sCellType ); - - /* Render if needed - if bUseRendered is true then we already have the rendered - * value in the data source - so can just use that - */ - nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null)) ? - _fnRender( oSettings, iRow, i ) : - _fnGetCellData( oSettings, iRow, i, 'display' ); - - /* Add user defined class */ - if ( oCol.sClass !== null ) - { - nTd.className = oCol.sClass; - } - - if ( oCol.bVisible ) - { - oData.nTr.appendChild( nTd ); - oData._anHidden[i] = null; - } - else - { - oData._anHidden[i] = nTd; - } - - if ( oCol.fnCreatedCell ) - { - oCol.fnCreatedCell.call( oSettings.oInstance, - nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i - ); - } - } - - _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] ); - } - } - - - /** - * Create the HTML header for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnBuildHead( oSettings ) - { - var i, nTh, iLen, j, jLen; - var iThs = oSettings.nTHead.getElementsByTagName('th').length; - var iCorrector = 0; - var jqChildren; - - /* If there is a header in place - then use it - otherwise it's going to get nuked... */ - if ( iThs !== 0 ) - { - /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */ - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - nTh.setAttribute('role', 'columnheader'); - if ( oSettings.aoColumns[i].bSortable ) - { - nTh.setAttribute('tabindex', oSettings.iTabIndex); - nTh.setAttribute('aria-controls', oSettings.sTableId); - } - - if ( oSettings.aoColumns[i].sClass !== null ) - { - $(nTh).addClass( oSettings.aoColumns[i].sClass ); - } - - /* Set the title of the column if it is user defined (not what was auto detected) */ - if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML ) - { - nTh.innerHTML = oSettings.aoColumns[i].sTitle; - } - } - } - else - { - /* We don't have a header in the DOM - so we are going to have to create one */ - var nTr = document.createElement( "tr" ); - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - nTh.innerHTML = oSettings.aoColumns[i].sTitle; - nTh.setAttribute('tabindex', '0'); - - if ( oSettings.aoColumns[i].sClass !== null ) - { - $(nTh).addClass( oSettings.aoColumns[i].sClass ); - } - - nTr.appendChild( nTh ); - } - $(oSettings.nTHead).html( '' )[0].appendChild( nTr ); - _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead ); - } - - /* ARIA role for the rows */ - $(oSettings.nTHead).children('tr').attr('role', 'row'); - - /* Add the extra markup needed by jQuery UI's themes */ - if ( oSettings.bJUI ) - { - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - nTh = oSettings.aoColumns[i].nTh; - - var nDiv = document.createElement('div'); - nDiv.className = oSettings.oClasses.sSortJUIWrapper; - $(nTh).contents().appendTo(nDiv); - - var nSpan = document.createElement('span'); - nSpan.className = oSettings.oClasses.sSortIcon; - nDiv.appendChild( nSpan ); - nTh.appendChild( nDiv ); - } - } - - if ( oSettings.oFeatures.bSort ) - { - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable !== false ) - { - _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i ); - } - else - { - $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone ); - } - } - } - - /* Deal with the footer - add classes if required */ - if ( oSettings.oClasses.sFooterTH !== "" ) - { - $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH ); - } - - /* Cache the footer elements */ - if ( oSettings.nTFoot !== null ) - { - var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter ); - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( anCells[i] ) - { - oSettings.aoColumns[i].nTf = anCells[i]; - if ( oSettings.aoColumns[i].sClass ) - { - $(anCells[i]).addClass( oSettings.aoColumns[i].sClass ); - } - } - } - } - } - - - /** - * Draw the header (or footer) element based on the column visibility states. The - * methodology here is to use the layout array from _fnDetectHeader, modified for - * the instantaneous column visibility, to construct the new layout. The grid is - * traversed over cell at a time in a rows x columns grid fashion, although each - * cell insert can cover multiple elements in the grid - which is tracks using the - * aApplied array. Cell inserts in the grid will only occur where there isn't - * already a cell in that position. - * @param {object} oSettings dataTables settings object - * @param array {objects} aoSource Layout array from _fnDetectHeader - * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, - * @memberof DataTable#oApi - */ - function _fnDrawHead( oSettings, aoSource, bIncludeHidden ) - { - var i, iLen, j, jLen, k, kLen, n, nLocalTr; - var aoLocal = []; - var aApplied = []; - var iColumns = oSettings.aoColumns.length; - var iRowspan, iColspan; - - if ( bIncludeHidden === undefined ) - { - bIncludeHidden = false; - } - - /* Make a copy of the master layout array, but without the visible columns in it */ - for ( i=0, iLen=aoSource.length ; i<iLen ; i++ ) - { - aoLocal[i] = aoSource[i].slice(); - aoLocal[i].nTr = aoSource[i].nTr; - - /* Remove any columns which are currently hidden */ - for ( j=iColumns-1 ; j>=0 ; j-- ) - { - if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden ) - { - aoLocal[i].splice( j, 1 ); - } - } - - /* Prep the applied array - it needs an element for each row */ - aApplied.push( [] ); - } - - for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ ) - { - nLocalTr = aoLocal[i].nTr; - - /* All cells are going to be replaced, so empty out the row */ - if ( nLocalTr ) - { - while( (n = nLocalTr.firstChild) ) - { - nLocalTr.removeChild( n ); - } - } - - for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ ) - { - iRowspan = 1; - iColspan = 1; - - /* Check to see if there is already a cell (row/colspan) covering our target - * insert point. If there is, then there is nothing to do. - */ - if ( aApplied[i][j] === undefined ) - { - nLocalTr.appendChild( aoLocal[i][j].cell ); - aApplied[i][j] = 1; - - /* Expand the cell to cover as many rows as needed */ - while ( aoLocal[i+iRowspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell ) - { - aApplied[i+iRowspan][j] = 1; - iRowspan++; - } - - /* Expand the cell to cover as many columns as needed */ - while ( aoLocal[i][j+iColspan] !== undefined && - aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell ) - { - /* Must update the applied array over the rows for the columns */ - for ( k=0 ; k<iRowspan ; k++ ) - { - aApplied[i+k][j+iColspan] = 1; - } - iColspan++; - } - - /* Do the actual expansion in the DOM */ - aoLocal[i][j].cell.rowSpan = iRowspan; - aoLocal[i][j].cell.colSpan = iColspan; - } - } - } - } - - - /** - * Insert the required TR nodes into the table for display - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnDraw( oSettings ) - { - /* Provide a pre-callback function which can be used to cancel the draw is false is returned */ - var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] ); - if ( $.inArray( false, aPreDraw ) !== -1 ) - { - _fnProcessingDisplay( oSettings, false ); - return; - } - - var i, iLen, n; - var anRows = []; - var iRowCount = 0; - var iStripes = oSettings.asStripeClasses.length; - var iOpenRows = oSettings.aoOpenRows.length; - - oSettings.bDrawing = true; - - /* Check and see if we have an initial draw position from state saving */ - if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 ) - { - if ( oSettings.oFeatures.bServerSide ) - { - oSettings._iDisplayStart = oSettings.iInitDisplayStart; - } - else - { - oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ? - 0 : oSettings.iInitDisplayStart; - } - oSettings.iInitDisplayStart = -1; - _fnCalculateEnd( oSettings ); - } - - /* Server-side processing draw intercept */ - if ( oSettings.bDeferLoading ) - { - oSettings.bDeferLoading = false; - oSettings.iDraw++; - } - else if ( !oSettings.oFeatures.bServerSide ) - { - oSettings.iDraw++; - } - else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) ) - { - return; - } - - if ( oSettings.aiDisplay.length !== 0 ) - { - var iStart = oSettings._iDisplayStart; - var iEnd = oSettings._iDisplayEnd; - - if ( oSettings.oFeatures.bServerSide ) - { - iStart = 0; - iEnd = oSettings.aoData.length; - } - - for ( var j=iStart ; j<iEnd ; j++ ) - { - var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ]; - if ( aoData.nTr === null ) - { - _fnCreateTr( oSettings, oSettings.aiDisplay[j] ); - } - - var nRow = aoData.nTr; - - /* Remove the old striping classes and then add the new one */ - if ( iStripes !== 0 ) - { - var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ]; - if ( aoData._sRowStripe != sStripe ) - { - $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe ); - aoData._sRowStripe = sStripe; - } - } - - /* Row callback functions - might want to manipule the row */ - _fnCallbackFire( oSettings, 'aoRowCallback', null, - [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] ); - - anRows.push( nRow ); - iRowCount++; - - /* If there is an open row - and it is attached to this parent - attach it on redraw */ - if ( iOpenRows !== 0 ) - { - for ( var k=0 ; k<iOpenRows ; k++ ) - { - if ( nRow == oSettings.aoOpenRows[k].nParent ) - { - anRows.push( oSettings.aoOpenRows[k].nTr ); - break; - } - } - } - } - } - else - { - /* Table is empty - create a row with an empty message in it */ - anRows[ 0 ] = document.createElement( 'tr' ); - - if ( oSettings.asStripeClasses[0] ) - { - anRows[ 0 ].className = oSettings.asStripeClasses[0]; - } - - var oLang = oSettings.oLanguage; - var sZero = oLang.sZeroRecords; - if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide ) - { - sZero = oLang.sLoadingRecords; - } - else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 ) - { - sZero = oLang.sEmptyTable; - } - - var nTd = document.createElement( 'td' ); - nTd.setAttribute( 'valign', "top" ); - nTd.colSpan = _fnVisbleColumns( oSettings ); - nTd.className = oSettings.oClasses.sRowEmpty; - nTd.innerHTML = _fnInfoMacros( oSettings, sZero ); - - anRows[ iRowCount ].appendChild( nTd ); - } - - /* Header and footer callbacks */ - _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], - _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - - _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], - _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - - /* - * Need to remove any old row from the display - note we can't just empty the tbody using - * $().html('') since this will unbind the jQuery event handlers (even although the node - * still exists!) - equally we can't use innerHTML, since IE throws an exception. - */ - var - nAddFrag = document.createDocumentFragment(), - nRemoveFrag = document.createDocumentFragment(), - nBodyPar, nTrs; - - if ( oSettings.nTBody ) - { - nBodyPar = oSettings.nTBody.parentNode; - nRemoveFrag.appendChild( oSettings.nTBody ); - - /* When doing infinite scrolling, only remove child rows when sorting, filtering or start - * up. When not infinite scroll, always do it. - */ - if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete || - oSettings.bSorted || oSettings.bFiltered ) - { - while( (n = oSettings.nTBody.firstChild) ) - { - oSettings.nTBody.removeChild( n ); - } - } - - /* Put the draw table into the dom */ - for ( i=0, iLen=anRows.length ; i<iLen ; i++ ) - { - nAddFrag.appendChild( anRows[i] ); - } - - oSettings.nTBody.appendChild( nAddFrag ); - if ( nBodyPar !== null ) - { - nBodyPar.appendChild( oSettings.nTBody ); - } - } - - /* Call all required callback functions for the end of a draw */ - _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] ); - - /* Draw is complete, sorting and filtering must be as well */ - oSettings.bSorted = false; - oSettings.bFiltered = false; - oSettings.bDrawing = false; - - if ( oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - if ( !oSettings._bInitComplete ) - { - _fnInitComplete( oSettings ); - } - } - } - - - /** - * Redraw the table - taking account of the various features which are enabled - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnReDraw( oSettings ) - { - if ( oSettings.oFeatures.bSort ) - { - /* Sorting will refilter and draw for us */ - _fnSort( oSettings, oSettings.oPreviousSearch ); - } - else if ( oSettings.oFeatures.bFilter ) - { - /* Filtering will redraw for us */ - _fnFilterComplete( oSettings, oSettings.oPreviousSearch ); - } - else - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - - - /** - * Add the options to the page HTML for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnAddOptionsHtml ( oSettings ) - { - /* - * Create a temporary, empty, div which we can later on replace with what we have generated - * we do it this way to rendering the 'options' html offline - speed :-) - */ - var nHolding = $('<div></div>')[0]; - oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); - - /* - * All DataTables are wrapped in a div - */ - oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0]; - oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; - - /* Track where we want to insert the option */ - var nInsertNode = oSettings.nTableWrapper; - - /* Loop over the user set positioning and place the elements as needed */ - var aDom = oSettings.sDom.split(''); - var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j; - for ( var i=0 ; i<aDom.length ; i++ ) - { - iPushFeature = 0; - cOption = aDom[i]; - - if ( cOption == '<' ) - { - /* New container div */ - nNewNode = $('<div></div>')[0]; - - /* Check to see if we should append an id and/or a class name to the container */ - cNext = aDom[i+1]; - if ( cNext == "'" || cNext == '"' ) - { - sAttr = ""; - j = 2; - while ( aDom[i+j] != cNext ) - { - sAttr += aDom[i+j]; - j++; - } - - /* Replace jQuery UI constants */ - if ( sAttr == "H" ) - { - sAttr = oSettings.oClasses.sJUIHeader; - } - else if ( sAttr == "F" ) - { - sAttr = oSettings.oClasses.sJUIFooter; - } - - /* The attribute can be in the format of "#id.class", "#id" or "class" This logic - * breaks the string into parts and applies them as needed - */ - if ( sAttr.indexOf('.') != -1 ) - { - var aSplit = sAttr.split('.'); - nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); - nNewNode.className = aSplit[1]; - } - else if ( sAttr.charAt(0) == "#" ) - { - nNewNode.id = sAttr.substr(1, sAttr.length-1); - } - else - { - nNewNode.className = sAttr; - } - - i += j; /* Move along the position array */ - } - - nInsertNode.appendChild( nNewNode ); - nInsertNode = nNewNode; - } - else if ( cOption == '>' ) - { - /* End container div */ - nInsertNode = nInsertNode.parentNode; - } - else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange ) - { - /* Length */ - nTmp = _fnFeatureHtmlLength( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'f' && oSettings.oFeatures.bFilter ) - { - /* Filter */ - nTmp = _fnFeatureHtmlFilter( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'r' && oSettings.oFeatures.bProcessing ) - { - /* pRocessing */ - nTmp = _fnFeatureHtmlProcessing( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 't' ) - { - /* Table */ - nTmp = _fnFeatureHtmlTable( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'i' && oSettings.oFeatures.bInfo ) - { - /* Info */ - nTmp = _fnFeatureHtmlInfo( oSettings ); - iPushFeature = 1; - } - else if ( cOption == 'p' && oSettings.oFeatures.bPaginate ) - { - /* Pagination */ - nTmp = _fnFeatureHtmlPaginate( oSettings ); - iPushFeature = 1; - } - else if ( DataTable.ext.aoFeatures.length !== 0 ) - { - /* Plug-in features */ - var aoFeatures = DataTable.ext.aoFeatures; - for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ ) - { - if ( cOption == aoFeatures[k].cFeature ) - { - nTmp = aoFeatures[k].fnInit( oSettings ); - if ( nTmp ) - { - iPushFeature = 1; - } - break; - } - } - } - - /* Add to the 2D features array */ - if ( iPushFeature == 1 && nTmp !== null ) - { - if ( typeof oSettings.aanFeatures[cOption] !== 'object' ) - { - oSettings.aanFeatures[cOption] = []; - } - oSettings.aanFeatures[cOption].push( nTmp ); - nInsertNode.appendChild( nTmp ); - } - } - - /* Built our DOM structure - replace the holding div with what we want */ - nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding ); - } - - - /** - * Use the DOM source to create up an array of header cells. The idea here is to - * create a layout grid (array) of rows x columns, which contains a reference - * to the cell that that point in the grid (regardless of col/rowspan), such that - * any column / row could be removed and the new grid constructed - * @param array {object} aLayout Array to store the calculated layout in - * @param {node} nThead The header/footer element for the table - * @memberof DataTable#oApi - */ - function _fnDetectHeader ( aLayout, nThead ) - { - var nTrs = $(nThead).children('tr'); - var nCell; - var i, j, k, l, iLen, jLen, iColShifted; - var fnShiftCol = function ( a, i, j ) { - while ( a[i][j] ) { - j++; - } - return j; - }; - - aLayout.splice( 0, aLayout.length ); - - /* We know how many rows there are in the layout - so prep it */ - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - aLayout.push( [] ); - } - - /* Calculate a layout array */ - for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) - { - var iColumn = 0; - - /* For every cell in the row... */ - for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ ) - { - nCell = nTrs[i].childNodes[j]; - - if ( nCell.nodeName.toUpperCase() == "TD" || - nCell.nodeName.toUpperCase() == "TH" ) - { - /* Get the col and rowspan attributes from the DOM and sanitise them */ - var iColspan = nCell.getAttribute('colspan') * 1; - var iRowspan = nCell.getAttribute('rowspan') * 1; - iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan; - iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan; - - /* There might be colspan cells already in this row, so shift our target - * accordingly - */ - iColShifted = fnShiftCol( aLayout, i, iColumn ); - - /* If there is col / rowspan, copy the information into the layout grid */ - for ( l=0 ; l<iColspan ; l++ ) - { - for ( k=0 ; k<iRowspan ; k++ ) - { - aLayout[i+k][iColShifted+l] = { - "cell": nCell, - "unique": iColspan == 1 ? true : false - }; - aLayout[i+k].nTr = nTrs[i]; - } - } - } - } - } - } - - - /** - * Get an array of unique th elements, one for each column - * @param {object} oSettings dataTables settings object - * @param {node} nHeader automatically detect the layout from this node - optional - * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional - * @returns array {node} aReturn list of unique ths - * @memberof DataTable#oApi - */ - function _fnGetUniqueThs ( oSettings, nHeader, aLayout ) - { - var aReturn = []; - if ( !aLayout ) - { - aLayout = oSettings.aoHeader; - if ( nHeader ) - { - aLayout = []; - _fnDetectHeader( aLayout, nHeader ); - } - } - - for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ ) - { - for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ ) - { - if ( aLayout[i][j].unique && - (!aReturn[j] || !oSettings.bSortCellsTop) ) - { - aReturn[j] = aLayout[i][j].cell; - } - } - } - - return aReturn; - } - - - - /** - * Update the table using an Ajax call - * @param {object} oSettings dataTables settings object - * @returns {boolean} Block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxUpdate( oSettings ) - { - if ( oSettings.bAjaxDataGet ) - { - oSettings.iDraw++; - _fnProcessingDisplay( oSettings, true ); - var iColumns = oSettings.aoColumns.length; - var aoData = _fnAjaxParameters( oSettings ); - _fnServerParams( oSettings, aoData ); - - oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, - function(json) { - _fnAjaxUpdateDraw( oSettings, json ); - }, oSettings ); - return false; - } - else - { - return true; - } - } - - - /** - * Build up the parameters in an object needed for a server-side processing request - * @param {object} oSettings dataTables settings object - * @returns {bool} block the table drawing or not - * @memberof DataTable#oApi - */ - function _fnAjaxParameters( oSettings ) - { - var iColumns = oSettings.aoColumns.length; - var aoData = [], mDataProp, aaSort, aDataSort; - var i, j; - - aoData.push( { "name": "sEcho", "value": oSettings.iDraw } ); - aoData.push( { "name": "iColumns", "value": iColumns } ); - aoData.push( { "name": "sColumns", "value": _fnColumnOrdering(oSettings) } ); - aoData.push( { "name": "iDisplayStart", "value": oSettings._iDisplayStart } ); - aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ? - oSettings._iDisplayLength : -1 } ); - - for ( i=0 ; i<iColumns ; i++ ) - { - mDataProp = oSettings.aoColumns[i].mDataProp; - aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } ); - } - - /* Filtering */ - if ( oSettings.oFeatures.bFilter !== false ) - { - aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } ); - aoData.push( { "name": "bRegex", "value": oSettings.oPreviousSearch.bRegex } ); - for ( i=0 ; i<iColumns ; i++ ) - { - aoData.push( { "name": "sSearch_"+i, "value": oSettings.aoPreSearchCols[i].sSearch } ); - aoData.push( { "name": "bRegex_"+i, "value": oSettings.aoPreSearchCols[i].bRegex } ); - aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } ); - } - } - - /* Sorting */ - if ( oSettings.oFeatures.bSort !== false ) - { - var iCounter = 0; - - aaSort = ( oSettings.aaSortingFixed !== null ) ? - oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : - oSettings.aaSorting.slice(); - - for ( i=0 ; i<aaSort.length ; i++ ) - { - aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort; - - for ( j=0 ; j<aDataSort.length ; j++ ) - { - aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } ); - aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } ); - iCounter++; - } - } - aoData.push( { "name": "iSortingCols", "value": iCounter } ); - - for ( i=0 ; i<iColumns ; i++ ) - { - aoData.push( { "name": "bSortable_"+i, "value": oSettings.aoColumns[i].bSortable } ); - } - } - - return aoData; - } - - - /** - * Add Ajax parameters from plugins - * @param {object} oSettings dataTables settings object - * @param array {objects} aoData name/value pairs to send to the server - * @memberof DataTable#oApi - */ - function _fnServerParams( oSettings, aoData ) - { - _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] ); - } - - - /** - * Data the data from the server (nuking the old) and redraw the table - * @param {object} oSettings dataTables settings object - * @param {object} json json data return from the server. - * @param {string} json.sEcho Tracking flag for DataTables to match requests - * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering - * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering - * @param {array} json.aaData The data to display on this page - * @param {string} [json.sColumns] Column ordering (sName, comma separated) - * @memberof DataTable#oApi - */ - function _fnAjaxUpdateDraw ( oSettings, json ) - { - if ( json.sEcho !== undefined ) - { - /* Protect against old returns over-writing a new one. Possible when you get - * very fast interaction, and later queires are completed much faster - */ - if ( json.sEcho*1 < oSettings.iDraw ) - { - return; - } - else - { - oSettings.iDraw = json.sEcho * 1; - } - } - - if ( !oSettings.oScroll.bInfinite || - (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) ) - { - _fnClearTable( oSettings ); - } - oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10); - oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10); - - /* Determine if reordering is required */ - var sOrdering = _fnColumnOrdering(oSettings); - var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering ); - var aiIndex; - if ( bReOrder ) - { - aiIndex = _fnReOrderIndex( oSettings, json.sColumns ); - } - - var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json ); - for ( var i=0, iLen=aData.length ; i<iLen ; i++ ) - { - if ( bReOrder ) - { - /* If we need to re-order, then create a new array with the correct order and add it */ - var aDataSorted = []; - for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ ) - { - aDataSorted.push( aData[i][ aiIndex[j] ] ); - } - _fnAddData( oSettings, aDataSorted ); - } - else - { - /* No re-order required, sever got it "right" - just straight add */ - _fnAddData( oSettings, aData[i] ); - } - } - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - oSettings.bAjaxDataGet = false; - _fnDraw( oSettings ); - oSettings.bAjaxDataGet = true; - _fnProcessingDisplay( oSettings, false ); - } - - - - /** - * Generate the node required for filtering text - * @returns {node} Filter control element - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlFilter ( oSettings ) - { - var oPreviousSearch = oSettings.oPreviousSearch; - - var sSearchStr = oSettings.oLanguage.sSearch; - sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ? - sSearchStr.replace('_INPUT_', '<input type="text" />') : - sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />'; - - var nFilter = document.createElement( 'div' ); - nFilter.className = oSettings.oClasses.sFilter; - nFilter.innerHTML = '<label>'+sSearchStr+'</label>'; - if ( !oSettings.aanFeatures.f ) - { - nFilter.id = oSettings.sTableId+'_filter'; - } - - var jqFilter = $('input[type="text"]', nFilter); - - // Store a reference to the input element, so other input elements could be - // added to the filter wrapper if needed (submit button for example) - nFilter._DT_Input = jqFilter[0]; - - jqFilter.val( oPreviousSearch.sSearch.replace('"','"') ); - jqFilter.bind( 'keyup.DT', function(e) { - /* Update all other filter input elements for the new display */ - var n = oSettings.aanFeatures.f; - var val = this.value==="" ? "" : this.value; // mental IE8 fix :-( - - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - if ( n[i] != $(this).parents('div.dataTables_filter')[0] ) - { - $(n[i]._DT_Input).val( val ); - } - } - - /* Now do the filter */ - if ( val != oPreviousSearch.sSearch ) - { - _fnFilterComplete( oSettings, { - "sSearch": val, - "bRegex": oPreviousSearch.bRegex, - "bSmart": oPreviousSearch.bSmart , - "bCaseInsensitive": oPreviousSearch.bCaseInsensitive - } ); - } - } ); - - jqFilter - .attr('aria-controls', oSettings.sTableId) - .bind( 'keypress.DT', function(e) { - /* Prevent form submission */ - if ( e.keyCode == 13 ) - { - return false; - } - } - ); - - return nFilter; - } - - - /** - * Filter the table using both the global filter and column based filtering - * @param {object} oSettings dataTables settings object - * @param {object} oSearch search information - * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0) - * @memberof DataTable#oApi - */ - function _fnFilterComplete ( oSettings, oInput, iForce ) - { - var oPrevSearch = oSettings.oPreviousSearch; - var aoPrevSearch = oSettings.aoPreSearchCols; - var fnSaveFilter = function ( oFilter ) { - /* Save the filtering values */ - oPrevSearch.sSearch = oFilter.sSearch; - oPrevSearch.bRegex = oFilter.bRegex; - oPrevSearch.bSmart = oFilter.bSmart; - oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive; - }; - - /* In server-side processing all filtering is done by the server, so no point hanging around here */ - if ( !oSettings.oFeatures.bServerSide ) - { - /* Global filter */ - _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive ); - fnSaveFilter( oInput ); - - /* Now do the individual column filter */ - for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ ) - { - _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, - aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive ); - } - - /* Custom filtering */ - _fnFilterCustom( oSettings ); - } - else - { - fnSaveFilter( oInput ); - } - - /* Tell the draw function we have been filtering */ - oSettings.bFiltered = true; - $(oSettings.oInstance).trigger('filter', oSettings); - - /* Redraw the table */ - oSettings._iDisplayStart = 0; - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - - /* Rebuild search array 'offline' */ - _fnBuildSearchArray( oSettings, 0 ); - } - - - /** - * Apply custom filtering functions - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnFilterCustom( oSettings ) - { - var afnFilters = DataTable.ext.afnFiltering; - for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ ) - { - var iCorrector = 0; - for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ ) - { - var iDisIndex = oSettings.aiDisplay[j-iCorrector]; - - /* Check if we should use this row based on the filtering function */ - if ( !afnFilters[i]( oSettings, _fnGetRowData( oSettings, iDisIndex, 'filter' ), iDisIndex ) ) - { - oSettings.aiDisplay.splice( j-iCorrector, 1 ); - iCorrector++; - } - } - } - } - - - /** - * Filter the table on a per-column basis - * @param {object} oSettings dataTables settings object - * @param {string} sInput string to filter on - * @param {int} iColumn column to filter - * @param {bool} bRegex treat search string as a regular expression or not - * @param {bool} bSmart use smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @memberof DataTable#oApi - */ - function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive ) - { - if ( sInput === "" ) - { - return; - } - - var iIndexCorrector = 0; - var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); - - for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- ) - { - var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ), - oSettings.aoColumns[iColumn].sType ); - if ( ! rpSearch.test( sData ) ) - { - oSettings.aiDisplay.splice( i, 1 ); - iIndexCorrector++; - } - } - } - - - /** - * Filter the data table based on user input and draw the table - * @param {object} oSettings dataTables settings object - * @param {string} sInput string to filter on - * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0) - * @param {bool} bRegex treat as a regular expression or not - * @param {bool} bSmart perform smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @memberof DataTable#oApi - */ - function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive ) - { - var i; - var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); - var oPrevSearch = oSettings.oPreviousSearch; - - /* Check if we are forcing or not - optional parameter */ - if ( !iForce ) - { - iForce = 0; - } - - /* Need to take account of custom filtering functions - always filter */ - if ( DataTable.ext.afnFiltering.length !== 0 ) - { - iForce = 1; - } - - /* - * If the input is blank - we want the full data set - */ - if ( sInput.length <= 0 ) - { - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - } - else - { - /* - * We are starting a new search or the new search string is smaller - * then the old one (i.e. delete). Search from the master array - */ - if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || - oPrevSearch.sSearch.length > sInput.length || iForce == 1 || - sInput.indexOf(oPrevSearch.sSearch) !== 0 ) - { - /* Nuke the old display array - we are going to rebuild it */ - oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); - - /* Force a rebuild of the search array */ - _fnBuildSearchArray( oSettings, 1 ); - - /* Search through all records to populate the search array - * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 - * mapping - */ - for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ ) - { - if ( rpSearch.test(oSettings.asDataSearch[i]) ) - { - oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] ); - } - } - } - else - { - /* Using old search array - refine it - do it this way for speed - * Don't have to search the whole master array again - */ - var iIndexCorrector = 0; - - /* Search the current results */ - for ( i=0 ; i<oSettings.asDataSearch.length ; i++ ) - { - if ( ! rpSearch.test(oSettings.asDataSearch[i]) ) - { - oSettings.aiDisplay.splice( i-iIndexCorrector, 1 ); - iIndexCorrector++; - } - } - } - } - } - - - /** - * Create an array which can be quickly search through - * @param {object} oSettings dataTables settings object - * @param {int} iMaster use the master data array - optional - * @memberof DataTable#oApi - */ - function _fnBuildSearchArray ( oSettings, iMaster ) - { - if ( !oSettings.oFeatures.bServerSide ) - { - /* Clear out the old data */ - oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length ); - - var aArray = (iMaster && iMaster===1) ? - oSettings.aiDisplayMaster : oSettings.aiDisplay; - - for ( var i=0, iLen=aArray.length ; i<iLen ; i++ ) - { - oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings, - _fnGetRowData( oSettings, aArray[i], 'filter' ) ); - } - } - } - - - /** - * Create a searchable string from a single data row - * @param {object} oSettings dataTables settings object - * @param {array} aData Row data array to use for the data to search - * @memberof DataTable#oApi - */ - function _fnBuildSearchRow( oSettings, aData ) - { - var sSearch = ''; - if ( oSettings.__nTmpFilter === undefined ) - { - oSettings.__nTmpFilter = document.createElement('div'); - } - var nTmp = oSettings.__nTmpFilter; - - for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ ) - { - if ( oSettings.aoColumns[j].bSearchable ) - { - var sData = aData[j]; - sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' '; - } - } - - /* If it looks like there is an HTML entity in the string, attempt to decode it */ - if ( sSearch.indexOf('&') !== -1 ) - { - nTmp.innerHTML = sSearch; - sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText; - - /* IE and Opera appear to put an newline where there is a <br> tag - remove it */ - sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,""); - } - - return sSearch; - } - - /** - * Build a regular expression object suitable for searching a table - * @param {string} sSearch string to search for - * @param {bool} bRegex treat as a regular expression or not - * @param {bool} bSmart perform smart filtering or not - * @param {bool} bCaseInsensitive Do case insenstive matching or not - * @returns {RegExp} constructed object - * @memberof DataTable#oApi - */ - function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive ) - { - var asSearch, sRegExpString; - - if ( bSmart ) - { - /* Generate the regular expression to use. Something along the lines of: - * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ - */ - asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' ); - sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$'; - return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" ); - } - else - { - sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch ); - return new RegExp( sSearch, bCaseInsensitive ? "i" : "" ); - } - } - - - /** - * Convert raw data into something that the user can search on - * @param {string} sData data to be modified - * @param {string} sType data type - * @returns {string} search string - * @memberof DataTable#oApi - */ - function _fnDataToSearch ( sData, sType ) - { - if ( typeof DataTable.ext.ofnSearch[sType] === "function" ) - { - return DataTable.ext.ofnSearch[sType]( sData ); - } - else if ( sData === null ) - { - return ''; - } - else if ( sType == "html" ) - { - return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" ); - } - else if ( typeof sData === "string" ) - { - return sData.replace(/[\r\n]/g," "); - } - return sData; - } - - - /** - * scape a string stuch that it can be used in a regular expression - * @param {string} sVal string to escape - * @returns {string} escaped string - * @memberof DataTable#oApi - */ - function _fnEscapeRegex ( sVal ) - { - var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ]; - var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' ); - return sVal.replace(reReplace, '\\$1'); - } - - - - /** - * Generate the node required for the info display - * @param {object} oSettings dataTables settings object - * @returns {node} Information element - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlInfo ( oSettings ) - { - var nInfo = document.createElement( 'div' ); - nInfo.className = oSettings.oClasses.sInfo; - - /* Actions that are to be taken once only for this feature */ - if ( !oSettings.aanFeatures.i ) - { - /* Add draw callback */ - oSettings.aoDrawCallback.push( { - "fn": _fnUpdateInfo, - "sName": "information" - } ); - - /* Add id */ - nInfo.id = oSettings.sTableId+'_info'; - } - oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' ); - - return nInfo; - } - - - /** - * Update the information elements in the display - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnUpdateInfo ( oSettings ) - { - /* Show information about the table */ - if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 ) - { - return; - } - - var - oLang = oSettings.oLanguage, - iStart = oSettings._iDisplayStart+1, - iEnd = oSettings.fnDisplayEnd(), - iMax = oSettings.fnRecordsTotal(), - iTotal = oSettings.fnRecordsDisplay(), - sOut; - - if ( iTotal === 0 && iTotal == iMax ) - { - /* Empty record set */ - sOut = oLang.sInfoEmpty; - } - else if ( iTotal === 0 ) - { - /* Empty record set after filtering */ - sOut = oLang.sInfoEmpty +' '+ oLang.sInfoFiltered; - } - else if ( iTotal == iMax ) - { - /* Normal record set */ - sOut = oLang.sInfo; - } - else - { - /* Record set after filtering */ - sOut = oLang.sInfo +' '+ oLang.sInfoFiltered; - } - - // Convert the macros - sOut += oLang.sInfoPostFix; - sOut = _fnInfoMacros( oSettings, sOut ); - - if ( oLang.fnInfoCallback !== null ) - { - sOut = oLang.fnInfoCallback.call( oSettings.oInstance, - oSettings, iStart, iEnd, iMax, iTotal, sOut ); - } - - var n = oSettings.aanFeatures.i; - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - $(n[i]).html( sOut ); - } - } - - - function _fnInfoMacros ( oSettings, str ) - { - var - iStart = oSettings._iDisplayStart+1, - sStart = oSettings.fnFormatNumber( iStart ), - iEnd = oSettings.fnDisplayEnd(), - sEnd = oSettings.fnFormatNumber( iEnd ), - iTotal = oSettings.fnRecordsDisplay(), - sTotal = oSettings.fnFormatNumber( iTotal ), - iMax = oSettings.fnRecordsTotal(), - sMax = oSettings.fnFormatNumber( iMax ); - - // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only - // internally - if ( oSettings.oScroll.bInfinite ) - { - sStart = oSettings.fnFormatNumber( 1 ); - } - - return str. - replace('_START_', sStart). - replace('_END_', sEnd). - replace('_TOTAL_', sTotal). - replace('_MAX_', sMax); - } - - - - /** - * Draw the table for the first time, adding all required features - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnInitialise ( oSettings ) - { - var i, iLen, iAjaxStart=oSettings.iInitDisplayStart; - - /* Ensure that the table data is fully initialised */ - if ( oSettings.bInitialised === false ) - { - setTimeout( function(){ _fnInitialise( oSettings ); }, 200 ); - return; - } - - /* Show the display HTML options */ - _fnAddOptionsHtml( oSettings ); - - /* Build and draw the header / footer for the table */ - _fnBuildHead( oSettings ); - _fnDrawHead( oSettings, oSettings.aoHeader ); - if ( oSettings.nTFoot ) - { - _fnDrawHead( oSettings, oSettings.aoFooter ); - } - - /* Okay to show that something is going on now */ - _fnProcessingDisplay( oSettings, true ); - - /* Calculate sizes for columns */ - if ( oSettings.oFeatures.bAutoWidth ) - { - _fnCalculateColumnWidths( oSettings ); - } - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( oSettings.aoColumns[i].sWidth !== null ) - { - oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth ); - } - } - - /* If there is default sorting required - let's do it. The sort function will do the - * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows - * the table to look initialised for Ajax sourcing data (show 'loading' message possibly) - */ - if ( oSettings.oFeatures.bSort ) - { - _fnSort( oSettings ); - } - else if ( oSettings.oFeatures.bFilter ) - { - _fnFilterComplete( oSettings, oSettings.oPreviousSearch ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - /* if there is an ajax source load the data */ - if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide ) - { - var aoData = []; - _fnServerParams( oSettings, aoData ); - oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) { - var aData = (oSettings.sAjaxDataProp !== "") ? - _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json; - - /* Got the data - add it to the table */ - for ( i=0 ; i<aData.length ; i++ ) - { - _fnAddData( oSettings, aData[i] ); - } - - /* Reset the init display for cookie saving. We've already done a filter, and - * therefore cleared it before. So we need to make it appear 'fresh' - */ - oSettings.iInitDisplayStart = iAjaxStart; - - if ( oSettings.oFeatures.bSort ) - { - _fnSort( oSettings ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - _fnProcessingDisplay( oSettings, false ); - _fnInitComplete( oSettings, json ); - }, oSettings ); - return; - } - - /* Server-side processing initialisation complete is done at the end of _fnDraw */ - if ( !oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - _fnInitComplete( oSettings ); - } - } - - - /** - * Draw the table for the first time, adding all required features - * @param {object} oSettings dataTables settings object - * @param {object} [json] JSON from the server that completed the table, if using Ajax source - * with client-side processing (optional) - * @memberof DataTable#oApi - */ - function _fnInitComplete ( oSettings, json ) - { - oSettings._bInitComplete = true; - _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] ); - } - - - /** - * Language compatibility - when certain options are given, and others aren't, we - * need to duplicate the values over, in order to provide backwards compatibility - * with older language files. - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnLanguageCompat( oLanguage ) - { - var oDefaults = DataTable.defaults.oLanguage; - - /* Backwards compatibility - if there is no sEmptyTable given, then use the same as - * sZeroRecords - assuming that is given. - */ - if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords && - oDefaults.sEmptyTable === "No data available in table" ) - { - _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' ); - } - - /* Likewise with loading records */ - if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords && - oDefaults.sLoadingRecords === "Loading..." ) - { - _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' ); - } - } - - - - /** - * Generate the node required for user display length changing - * @param {object} oSettings dataTables settings object - * @returns {node} Display length feature node - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlLength ( oSettings ) - { - if ( oSettings.oScroll.bInfinite ) - { - return null; - } - - /* This can be overruled by not using the _MENU_ var/macro in the language variable */ - var sName = 'name="'+oSettings.sTableId+'_length"'; - var sStdMenu = '<select size="1" '+sName+'>'; - var i, iLen; - var aLengthMenu = oSettings.aLengthMenu; - - if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && - typeof aLengthMenu[1] === 'object' ) - { - for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ ) - { - sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>'; - } - } - else - { - for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ ) - { - sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>'; - } - } - sStdMenu += '</select>'; - - var nLength = document.createElement( 'div' ); - if ( !oSettings.aanFeatures.l ) - { - nLength.id = oSettings.sTableId+'_length'; - } - nLength.className = oSettings.oClasses.sLength; - nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>'; - - /* - * Set the length to the current display length - thanks to Andrea Pavlovic for this fix, - * and Stefan Skopnik for fixing the fix! - */ - $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true); - - $('select', nLength).bind( 'change.DT', function(e) { - var iVal = $(this).val(); - - /* Update all other length options for the new display */ - var n = oSettings.aanFeatures.l; - for ( i=0, iLen=n.length ; i<iLen ; i++ ) - { - if ( n[i] != this.parentNode ) - { - $('select', n[i]).val( iVal ); - } - } - - /* Redraw the table */ - oSettings._iDisplayLength = parseInt(iVal, 10); - _fnCalculateEnd( oSettings ); - - /* If we have space to show extra rows (backing up from the end point - then do so */ - if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength; - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - - if ( oSettings._iDisplayLength == -1 ) - { - oSettings._iDisplayStart = 0; - } - - _fnDraw( oSettings ); - } ); - - - $('select', nLength).attr('aria-controls', oSettings.sTableId); - - return nLength; - } - - - /** - * Rcalculate the end point based on the start point - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnCalculateEnd( oSettings ) - { - if ( oSettings.oFeatures.bPaginate === false ) - { - oSettings._iDisplayEnd = oSettings.aiDisplay.length; - } - else - { - /* Set the end point of the display - based on how many elements there are - * still to display - */ - if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length || - oSettings._iDisplayLength == -1 ) - { - oSettings._iDisplayEnd = oSettings.aiDisplay.length; - } - else - { - oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; - } - } - } - - - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Note that most of the paging logic is done in - * DataTable.ext.oPagination - */ - - /** - * Generate the node required for default pagination - * @param {object} oSettings dataTables settings object - * @returns {node} Pagination feature node - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlPaginate ( oSettings ) - { - if ( oSettings.oScroll.bInfinite ) - { - return null; - } - - var nPaginate = document.createElement( 'div' ); - nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType; - - DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, - function( oSettings ) { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - ); - - /* Add a draw callback for the pagination on first instance, to update the paging display */ - if ( !oSettings.aanFeatures.p ) - { - oSettings.aoDrawCallback.push( { - "fn": function( oSettings ) { - DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } ); - }, - "sName": "pagination" - } ); - } - return nPaginate; - } - - - /** - * Alter the display settings to change the page - * @param {object} oSettings dataTables settings object - * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" - * or page number to jump to (integer) - * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1 - * @memberof DataTable#oApi - */ - function _fnPageChange ( oSettings, mAction ) - { - var iOldStart = oSettings._iDisplayStart; - - if ( typeof mAction === "number" ) - { - oSettings._iDisplayStart = mAction * oSettings._iDisplayLength; - if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "first" ) - { - oSettings._iDisplayStart = 0; - } - else if ( mAction == "previous" ) - { - oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? - oSettings._iDisplayStart - oSettings._iDisplayLength : - 0; - - /* Correct for underrun */ - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "next" ) - { - if ( oSettings._iDisplayLength >= 0 ) - { - /* Make sure we are not over running the display array */ - if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart += oSettings._iDisplayLength; - } - } - else - { - oSettings._iDisplayStart = 0; - } - } - else if ( mAction == "last" ) - { - if ( oSettings._iDisplayLength >= 0 ) - { - var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1; - oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength; - } - else - { - oSettings._iDisplayStart = 0; - } - } - else - { - _fnLog( oSettings, 0, "Unknown paging action: "+mAction ); - } - $(oSettings.oInstance).trigger('page', oSettings); - - return iOldStart != oSettings._iDisplayStart; - } - - - - /** - * Generate the node required for the processing node - * @param {object} oSettings dataTables settings object - * @returns {node} Processing element - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlProcessing ( oSettings ) - { - var nProcessing = document.createElement( 'div' ); - - if ( !oSettings.aanFeatures.r ) - { - nProcessing.id = oSettings.sTableId+'_processing'; - } - nProcessing.innerHTML = oSettings.oLanguage.sProcessing; - nProcessing.className = oSettings.oClasses.sProcessing; - oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable ); - - return nProcessing; - } - - - /** - * Display or hide the processing indicator - * @param {object} oSettings dataTables settings object - * @param {bool} bShow Show the processing indicator (true) or not (false) - * @memberof DataTable#oApi - */ - function _fnProcessingDisplay ( oSettings, bShow ) - { - if ( oSettings.oFeatures.bProcessing ) - { - var an = oSettings.aanFeatures.r; - for ( var i=0, iLen=an.length ; i<iLen ; i++ ) - { - an[i].style.visibility = bShow ? "visible" : "hidden"; - } - } - - $(oSettings.oInstance).trigger('processing', [oSettings, bShow]); - } - - - - /** - * Add any control elements for the table - specifically scrolling - * @param {object} oSettings dataTables settings object - * @returns {node} Node to add to the DOM - * @memberof DataTable#oApi - */ - function _fnFeatureHtmlTable ( oSettings ) - { - /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */ - if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" ) - { - return oSettings.nTable; - } - - /* - * The HTML structure that we want to generate in this function is: - * div - nScroller - * div - nScrollHead - * div - nScrollHeadInner - * table - nScrollHeadTable - * thead - nThead - * div - nScrollBody - * table - oSettings.nTable - * thead - nTheadSize - * tbody - nTbody - * div - nScrollFoot - * div - nScrollFootInner - * table - nScrollFootTable - * tfoot - nTfoot - */ - var - nScroller = document.createElement('div'), - nScrollHead = document.createElement('div'), - nScrollHeadInner = document.createElement('div'), - nScrollBody = document.createElement('div'), - nScrollFoot = document.createElement('div'), - nScrollFootInner = document.createElement('div'), - nScrollHeadTable = oSettings.nTable.cloneNode(false), - nScrollFootTable = oSettings.nTable.cloneNode(false), - nThead = oSettings.nTable.getElementsByTagName('thead')[0], - nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : - oSettings.nTable.getElementsByTagName('tfoot')[0], - oClasses = oSettings.oClasses; - - nScrollHead.appendChild( nScrollHeadInner ); - nScrollFoot.appendChild( nScrollFootInner ); - nScrollBody.appendChild( oSettings.nTable ); - nScroller.appendChild( nScrollHead ); - nScroller.appendChild( nScrollBody ); - nScrollHeadInner.appendChild( nScrollHeadTable ); - nScrollHeadTable.appendChild( nThead ); - if ( nTfoot !== null ) - { - nScroller.appendChild( nScrollFoot ); - nScrollFootInner.appendChild( nScrollFootTable ); - nScrollFootTable.appendChild( nTfoot ); - } - - nScroller.className = oClasses.sScrollWrapper; - nScrollHead.className = oClasses.sScrollHead; - nScrollHeadInner.className = oClasses.sScrollHeadInner; - nScrollBody.className = oClasses.sScrollBody; - nScrollFoot.className = oClasses.sScrollFoot; - nScrollFootInner.className = oClasses.sScrollFootInner; - - if ( oSettings.oScroll.bAutoCss ) - { - nScrollHead.style.overflow = "hidden"; - nScrollHead.style.position = "relative"; - nScrollFoot.style.overflow = "hidden"; - nScrollBody.style.overflow = "auto"; - } - - nScrollHead.style.border = "0"; - nScrollHead.style.width = "100%"; - nScrollFoot.style.border = "0"; - nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ? - oSettings.oScroll.sXInner : "100%"; /* will be overwritten */ - - /* Modify attributes to respect the clones */ - nScrollHeadTable.removeAttribute('id'); - nScrollHeadTable.style.marginLeft = "0"; - oSettings.nTable.style.marginLeft = "0"; - if ( nTfoot !== null ) - { - nScrollFootTable.removeAttribute('id'); - nScrollFootTable.style.marginLeft = "0"; - } - - /* Move caption elements from the body to the header, footer or leave where it is - * depending on the configuration. Note that the DTD says there can be only one caption */ - var nCaption = $(oSettings.nTable).children('caption'); - if ( nCaption.length > 0 ) - { - nCaption = nCaption[0]; - if ( nCaption._captionSide === "top" ) - { - nScrollHeadTable.appendChild( nCaption ); - } - else if ( nCaption._captionSide === "bottom" && nTfoot ) - { - nScrollFootTable.appendChild( nCaption ); - } - } - - /* - * Sizing - */ - /* When xscrolling add the width and a scroller to move the header with the body */ - if ( oSettings.oScroll.sX !== "" ) - { - nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX ); - nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX ); - - if ( nTfoot !== null ) - { - nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX ); - } - - /* When the body is scrolled, then we also want to scroll the headers */ - $(nScrollBody).scroll( function (e) { - nScrollHead.scrollLeft = this.scrollLeft; - - if ( nTfoot !== null ) - { - nScrollFoot.scrollLeft = this.scrollLeft; - } - } ); - } - - /* When yscrolling, add the height */ - if ( oSettings.oScroll.sY !== "" ) - { - nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY ); - } - - /* Redraw - align columns across the tables */ - oSettings.aoDrawCallback.push( { - "fn": _fnScrollDraw, - "sName": "scrolling" - } ); - - /* Infinite scrolling event handlers */ - if ( oSettings.oScroll.bInfinite ) - { - $(nScrollBody).scroll( function() { - /* Use a blocker to stop scrolling from loading more data while other data is still loading */ - if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 ) - { - /* Check if we should load the next data set */ - if ( $(this).scrollTop() + $(this).height() > - $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) - { - /* Only do the redraw if we have to - we might be at the end of the data */ - if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() ) - { - _fnPageChange( oSettings, 'next' ); - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - } - } ); - } - - oSettings.nScrollHead = nScrollHead; - oSettings.nScrollFoot = nScrollFoot; - - return nScroller; - } - - - /** - * Update the various tables for resizing. It's a bit of a pig this function, but - * basically the idea to: - * 1. Re-create the table inside the scrolling div - * 2. Take live measurements from the DOM - * 3. Apply the measurements - * 4. Clean up - * @param {object} o dataTables settings object - * @returns {node} Node to add to the DOM - * @memberof DataTable#oApi - */ - function _fnScrollDraw ( o ) - { - var - nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0], - nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], - nScrollBody = o.nTable.parentNode, - i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis, - nTheadSize, nTfootSize, - iWidth, aApplied=[], iSanityWidth, - nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null, - nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null, - ie67 = $.browser.msie && $.browser.version <= 7; - - /* - * 1. Re-create the table inside the scrolling div - */ - - /* Remove the old minimised thead and tfoot elements in the inner table */ - $(o.nTable).children('thead, tfoot').remove(); - - /* Clone the current header and footer elements and then place it into the inner table */ - nTheadSize = $(o.nTHead).clone()[0]; - o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] ); - - if ( o.nTFoot !== null ) - { - nTfootSize = $(o.nTFoot).clone()[0]; - o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] ); - } - - /* - * 2. Take live measurements from the DOM - do not alter the DOM itself! - */ - - /* Remove old sizing and apply the calculated column widths - * Get the unique column headers in the newly created (cloned) header. We want to apply the - * calclated sizes to this header - */ - if ( o.oScroll.sX === "" ) - { - nScrollBody.style.width = '100%'; - nScrollHeadInner.parentNode.style.width = '100%'; - } - - var nThs = _fnGetUniqueThs( o, nTheadSize ); - for ( i=0, iLen=nThs.length ; i<iLen ; i++ ) - { - iVis = _fnVisibleToColumnIndex( o, i ); - nThs[i].style.width = o.aoColumns[iVis].sWidth; - } - - if ( o.nTFoot !== null ) - { - _fnApplyToChildren( function(n) { - n.style.width = ""; - }, nTfootSize.getElementsByTagName('tr') ); - } - - // If scroll collapse is enabled, when we put the headers back into the body for sizing, we - // will end up forcing the scrollbar to appear, making our measurements wrong for when we - // then hide it (end of this function), so add the header height to the body scroller. - if ( o.oScroll.bCollapse && o.oScroll.sY !== "" ) - { - nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px"; - } - - /* Size the table as a whole */ - iSanityWidth = $(o.nTable).outerWidth(); - if ( o.oScroll.sX === "" ) - { - /* No x scrolling */ - o.nTable.style.width = "100%"; - - /* I know this is rubbish - but IE7 will make the width of the table when 100% include - * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this - * into account. - */ - if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || - $(nScrollBody).css('overflow-y') == "scroll") ) - { - o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); - } - } - else - { - if ( o.oScroll.sXInner !== "" ) - { - /* x scroll inner has been given - use it */ - o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner); - } - else if ( iSanityWidth == $(nScrollBody).width() && - $(nScrollBody).height() < $(o.nTable).height() ) - { - /* There is y-scrolling - try to take account of the y scroll bar */ - o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth ); - if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth ) - { - /* Not possible to take account of it */ - o.nTable.style.width = _fnStringToCss( iSanityWidth ); - } - } - else - { - /* All else fails */ - o.nTable.style.width = _fnStringToCss( iSanityWidth ); - } - } - - /* Recalculate the sanity width - now that we've applied the required width, before it was - * a temporary variable. This is required because the column width calculation is done - * before this table DOM is created. - */ - iSanityWidth = $(o.nTable).outerWidth(); - - /* We want the hidden header to have zero height, so remove padding and borders. Then - * set the width based on the real headers - */ - anHeadToSize = o.nTHead.getElementsByTagName('tr'); - anHeadSizers = nTheadSize.getElementsByTagName('tr'); - - _fnApplyToChildren( function(nSizer, nToSize) { - oStyle = nSizer.style; - oStyle.paddingTop = "0"; - oStyle.paddingBottom = "0"; - oStyle.borderTopWidth = "0"; - oStyle.borderBottomWidth = "0"; - oStyle.height = 0; - - iWidth = $(nSizer).width(); - nToSize.style.width = _fnStringToCss( iWidth ); - aApplied.push( iWidth ); - }, anHeadSizers, anHeadToSize ); - $(anHeadSizers).height(0); - - if ( o.nTFoot !== null ) - { - /* Clone the current footer and then place it into the body table as a "hidden header" */ - anFootSizers = nTfootSize.getElementsByTagName('tr'); - anFootToSize = o.nTFoot.getElementsByTagName('tr'); - - _fnApplyToChildren( function(nSizer, nToSize) { - oStyle = nSizer.style; - oStyle.paddingTop = "0"; - oStyle.paddingBottom = "0"; - oStyle.borderTopWidth = "0"; - oStyle.borderBottomWidth = "0"; - oStyle.height = 0; - - iWidth = $(nSizer).width(); - nToSize.style.width = _fnStringToCss( iWidth ); - aApplied.push( iWidth ); - }, anFootSizers, anFootToSize ); - $(anFootSizers).height(0); - } - - /* - * 3. Apply the measurements - */ - - /* "Hide" the header and footer that we used for the sizing. We want to also fix their width - * to what they currently are - */ - _fnApplyToChildren( function(nSizer) { - nSizer.innerHTML = ""; - nSizer.style.width = _fnStringToCss( aApplied.shift() ); - }, anHeadSizers ); - - if ( o.nTFoot !== null ) - { - _fnApplyToChildren( function(nSizer) { - nSizer.innerHTML = ""; - nSizer.style.width = _fnStringToCss( aApplied.shift() ); - }, anFootSizers ); - } - - /* Sanity check that the table is of a sensible width. If not then we are going to get - * misalignment - try to prevent this by not allowing the table to shrink below its min width - */ - if ( $(o.nTable).outerWidth() < iSanityWidth ) - { - /* The min width depends upon if we have a vertical scrollbar visible or not */ - var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || - $(nScrollBody).css('overflow-y') == "scroll")) ? - iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; - - /* IE6/7 are a law unto themselves... */ - if ( ie67 && (nScrollBody.scrollHeight > - nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) - { - o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); - } - - /* Apply the calculated minimum width to the table wrappers */ - nScrollBody.style.width = _fnStringToCss( iCorrection ); - nScrollHeadInner.parentNode.style.width = _fnStringToCss( iCorrection ); - - if ( o.nTFoot !== null ) - { - nScrollFootInner.parentNode.style.width = _fnStringToCss( iCorrection ); - } - - /* And give the user a warning that we've stopped the table getting too small */ - if ( o.oScroll.sX === "" ) - { - _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ - " misalignment. The table has been drawn at its minimum possible width." ); - } - else if ( o.oScroll.sXInner !== "" ) - { - _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ - " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+ - " calculation" ); - } - } - else - { - nScrollBody.style.width = _fnStringToCss( '100%' ); - nScrollHeadInner.parentNode.style.width = _fnStringToCss( '100%' ); - - if ( o.nTFoot !== null ) - { - nScrollFootInner.parentNode.style.width = _fnStringToCss( '100%' ); - } - } - - - /* - * 4. Clean up - */ - if ( o.oScroll.sY === "" ) - { - /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting - * the scrollbar height from the visible display, rather than adding it on. We need to - * set the height in order to sort this. Don't want to do it in any other browsers. - */ - if ( ie67 ) - { - nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth ); - } - } - - if ( o.oScroll.sY !== "" && o.oScroll.bCollapse ) - { - nScrollBody.style.height = _fnStringToCss( o.oScroll.sY ); - - var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ? - o.oScroll.iBarWidth : 0; - if ( o.nTable.offsetHeight < nScrollBody.offsetHeight ) - { - nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra ); - } - } - - /* Finally set the width's of the header and footer tables */ - var iOuterWidth = $(o.nTable).outerWidth(); - nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth ); - nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth ); - - // Figure out if there are scrollbar present - if so then we need a the header and footer to - // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) - var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll"; - nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; - - if ( o.nTFoot !== null ) - { - nScrollFootTable.style.width = _fnStringToCss( iOuterWidth ); - nScrollFootInner.style.width = _fnStringToCss( iOuterWidth ); - nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; - } - - /* Adjust the position of the header incase we loose the y-scrollbar */ - $(nScrollBody).scroll(); - - /* If sorting or filtering has occurred, jump the scrolling back to the top */ - if ( o.bSorted || o.bFiltered ) - { - nScrollBody.scrollTop = 0; - } - } - - - /** - * Apply a given function to the display child nodes of an element array (typically - * TD children of TR rows - * @param {function} fn Method to apply to the objects - * @param array {nodes} an1 List of elements to look through for display children - * @param array {nodes} an2 Another list (identical structure to the first) - optional - * @memberof DataTable#oApi - */ - function _fnApplyToChildren( fn, an1, an2 ) - { - for ( var i=0, iLen=an1.length ; i<iLen ; i++ ) - { - for ( var j=0, jLen=an1[i].childNodes.length ; j<jLen ; j++ ) - { - if ( an1[i].childNodes[j].nodeType == 1 ) - { - if ( an2 ) - { - fn( an1[i].childNodes[j], an2[i].childNodes[j] ); - } - else - { - fn( an1[i].childNodes[j] ); - } - } - } - } - } - - - - /** - * Convert a CSS unit width to pixels (e.g. 2em) - * @param {string} sWidth width to be converted - * @param {node} nParent parent to get the with for (required for relative widths) - optional - * @returns {int} iWidth width in pixels - * @memberof DataTable#oApi - */ - function _fnConvertToWidth ( sWidth, nParent ) - { - if ( !sWidth || sWidth === null || sWidth === '' ) - { - return 0; - } - - if ( !nParent ) - { - nParent = document.getElementsByTagName('body')[0]; - } - - var iWidth; - var nTmp = document.createElement( "div" ); - nTmp.style.width = _fnStringToCss( sWidth ); - - nParent.appendChild( nTmp ); - iWidth = nTmp.offsetWidth; - nParent.removeChild( nTmp ); - - return ( iWidth ); - } - - - /** - * Calculate the width of columns for the table - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnCalculateColumnWidths ( oSettings ) - { - var iTableWidth = oSettings.nTable.offsetWidth; - var iUserInputs = 0; - var iTmpWidth; - var iVisibleColumns = 0; - var iColums = oSettings.aoColumns.length; - var i, iIndex, iCorrector, iWidth; - var oHeaders = $('th', oSettings.nTHead); - var widthAttr = oSettings.nTable.getAttribute('width'); - - /* Convert any user input sizes into pixel sizes */ - for ( i=0 ; i<iColums ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - iVisibleColumns++; - - if ( oSettings.aoColumns[i].sWidth !== null ) - { - iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, - oSettings.nTable.parentNode ); - if ( iTmpWidth !== null ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth ); - } - - iUserInputs++; - } - } - } - - /* If the number of columns in the DOM equals the number that we have to process in - * DataTables, then we can use the offsets that are created by the web-browser. No custom - * sizes can be set in order for this to happen, nor scrolling used - */ - if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums && - oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" ) - { - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - iTmpWidth = $(oHeaders[i]).width(); - if ( iTmpWidth !== null ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth ); - } - } - } - else - { - /* Otherwise we are going to have to do some calculations to get the width of each column. - * Construct a 1 row table with the widest node in the data, and any user defined widths, - * then insert it into the DOM and allow the browser to do all the hard work of - * calculating table widths. - */ - var - nCalcTmp = oSettings.nTable.cloneNode( false ), - nTheadClone = oSettings.nTHead.cloneNode(true), - nBody = document.createElement( 'tbody' ), - nTr = document.createElement( 'tr' ), - nDivSizing; - - nCalcTmp.removeAttribute( "id" ); - nCalcTmp.appendChild( nTheadClone ); - if ( oSettings.nTFoot !== null ) - { - nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) ); - _fnApplyToChildren( function(n) { - n.style.width = ""; - }, nCalcTmp.getElementsByTagName('tr') ); - } - - nCalcTmp.appendChild( nBody ); - nBody.appendChild( nTr ); - - /* Remove any sizing that was previously applied by the styles */ - var jqColSizing = $('thead th', nCalcTmp); - if ( jqColSizing.length === 0 ) - { - jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp); - } - - /* Apply custom sizing to the cloned header */ - var nThs = _fnGetUniqueThs( oSettings, nTheadClone ); - iCorrector = 0; - for ( i=0 ; i<iColums ; i++ ) - { - var oColumn = oSettings.aoColumns[i]; - if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" ) - { - nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig ); - } - else if ( oColumn.bVisible ) - { - nThs[i-iCorrector].style.width = ""; - } - else - { - iCorrector++; - } - } - - /* Find the biggest td for each column and put it into the table */ - for ( i=0 ; i<iColums ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - var nTd = _fnGetWidestNode( oSettings, i ); - if ( nTd !== null ) - { - nTd = nTd.cloneNode(true); - if ( oSettings.aoColumns[i].sContentPadding !== "" ) - { - nTd.innerHTML += oSettings.aoColumns[i].sContentPadding; - } - nTr.appendChild( nTd ); - } - } - } - - /* Build the table and 'display' it */ - var nWrapper = oSettings.nTable.parentNode; - nWrapper.appendChild( nCalcTmp ); - - /* When scrolling (X or Y) we want to set the width of the table as appropriate. However, - * when not scrolling leave the table width as it is. This results in slightly different, - * but I think correct behaviour - */ - if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" ) - { - nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner); - } - else if ( oSettings.oScroll.sX !== "" ) - { - nCalcTmp.style.width = ""; - if ( $(nCalcTmp).width() < nWrapper.offsetWidth ) - { - nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth ); - } - } - else if ( oSettings.oScroll.sY !== "" ) - { - nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth ); - } - else if ( widthAttr ) - { - nCalcTmp.style.width = _fnStringToCss( widthAttr ); - } - nCalcTmp.style.visibility = "hidden"; - - /* Scrolling considerations */ - _fnScrollingWidthAdjust( oSettings, nCalcTmp ); - - /* Read the width's calculated by the browser and store them for use by the caller. We - * first of all try to use the elements in the body, but it is possible that there are - * no elements there, under which circumstances we use the header elements - */ - var oNodes = $("tbody tr:eq(0)", nCalcTmp).children(); - if ( oNodes.length === 0 ) - { - oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] ); - } - - /* Browsers need a bit of a hand when a width is assigned to any columns when - * x-scrolling as they tend to collapse the table to the min-width, even if - * we sent the column widths. So we need to keep track of what the table width - * should be by summing the user given values, and the automatic values - */ - if ( oSettings.oScroll.sX !== "" ) - { - var iTotal = 0; - iCorrector = 0; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - if ( oSettings.aoColumns[i].sWidthOrig === null ) - { - iTotal += $(oNodes[iCorrector]).outerWidth(); - } - else - { - iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) + - ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width()); - } - iCorrector++; - } - } - - nCalcTmp.style.width = _fnStringToCss( iTotal ); - oSettings.nTable.style.width = _fnStringToCss( iTotal ); - } - - iCorrector = 0; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible ) - { - iWidth = $(oNodes[iCorrector]).width(); - if ( iWidth !== null && iWidth > 0 ) - { - oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth ); - } - iCorrector++; - } - } - - var cssWidth = $(nCalcTmp).css('width'); - oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ? - cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() ); - nCalcTmp.parentNode.removeChild( nCalcTmp ); - } - - if ( widthAttr ) - { - oSettings.nTable.style.width = _fnStringToCss( widthAttr ); - } - } - - - /** - * Adjust a table's width to take account of scrolling - * @param {object} oSettings dataTables settings object - * @param {node} n table node - * @memberof DataTable#oApi - */ - function _fnScrollingWidthAdjust ( oSettings, n ) - { - if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" ) - { - /* When y-scrolling only, we want to remove the width of the scroll bar so the table - * + scroll bar will fit into the area avaialble. - */ - var iOrigWidth = $(n).width(); - n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth ); - } - else if ( oSettings.oScroll.sX !== "" ) - { - /* When x-scrolling both ways, fix the table at it's current size, without adjusting */ - n.style.width = _fnStringToCss( $(n).outerWidth() ); - } - } - - - /** - * Get the widest node - * @param {object} oSettings dataTables settings object - * @param {int} iCol column of interest - * @returns {string} max strlens for each column - * @memberof DataTable#oApi - */ - function _fnGetWidestNode( oSettings, iCol ) - { - var iMaxIndex = _fnGetMaxLenString( oSettings, iCol ); - if ( iMaxIndex < 0 ) - { - return null; - } - - if ( oSettings.aoData[iMaxIndex].nTr === null ) - { - var n = document.createElement('td'); - n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' ); - return n; - } - return _fnGetTdNodes(oSettings, iMaxIndex)[iCol]; - } - - - /** - * Get the maximum strlen for each data column - * @param {object} oSettings dataTables settings object - * @param {int} iCol column of interest - * @returns {string} max strlens for each column - * @memberof DataTable#oApi - */ - function _fnGetMaxLenString( oSettings, iCol ) - { - var iMax = -1; - var iMaxIndex = -1; - - for ( var i=0 ; i<oSettings.aoData.length ; i++ ) - { - var s = _fnGetCellData( oSettings, i, iCol, 'display' )+""; - s = s.replace( /<.*?>/g, "" ); - if ( s.length > iMax ) - { - iMax = s.length; - iMaxIndex = i; - } - } - - return iMaxIndex; - } - - - /** - * Append a CSS unit (only if required) to a string - * @param {array} aArray1 first array - * @param {array} aArray2 second array - * @returns {int} 0 if match, 1 if length is different, 2 if no match - * @memberof DataTable#oApi - */ - function _fnStringToCss( s ) - { - if ( s === null ) - { - return "0px"; - } - - if ( typeof s == 'number' ) - { - if ( s < 0 ) - { - return "0px"; - } - return s+"px"; - } - - /* Check if the last character is not 0-9 */ - var c = s.charCodeAt( s.length-1 ); - if (c < 0x30 || c > 0x39) - { - return s; - } - return s+"px"; - } - - - /** - * Get the width of a scroll bar in this browser being used - * @returns {int} width in pixels - * @memberof DataTable#oApi - */ - function _fnScrollBarWidth () - { - var inner = document.createElement('p'); - var style = inner.style; - style.width = "100%"; - style.height = "200px"; - style.padding = "0px"; - - var outer = document.createElement('div'); - style = outer.style; - style.position = "absolute"; - style.top = "0px"; - style.left = "0px"; - style.visibility = "hidden"; - style.width = "200px"; - style.height = "150px"; - style.padding = "0px"; - style.overflow = "hidden"; - outer.appendChild(inner); - - document.body.appendChild(outer); - var w1 = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var w2 = inner.offsetWidth; - if ( w1 == w2 ) - { - w2 = outer.clientWidth; - } - - document.body.removeChild(outer); - return (w1 - w2); - } - - - - /** - * Change the order of the table - * @param {object} oSettings dataTables settings object - * @param {bool} bApplyClasses optional - should we apply classes or not - * @memberof DataTable#oApi - */ - function _fnSort ( oSettings, bApplyClasses ) - { - var - i, iLen, j, jLen, k, kLen, - sDataType, nTh, - aaSort = [], - aiOrig = [], - oSort = DataTable.ext.oSort, - aoData = oSettings.aoData, - aoColumns = oSettings.aoColumns, - oAria = oSettings.oLanguage.oAria; - - /* No sorting required if server-side or no sorting array */ - if ( !oSettings.oFeatures.bServerSide && - (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) - { - aaSort = ( oSettings.aaSortingFixed !== null ) ? - oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : - oSettings.aaSorting.slice(); - - /* If there is a sorting data type, and a fuction belonging to it, then we need to - * get the data from the developer's function and apply it for this column - */ - for ( i=0 ; i<aaSort.length ; i++ ) - { - var iColumn = aaSort[i][0]; - var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn ); - sDataType = oSettings.aoColumns[ iColumn ].sSortDataType; - if ( DataTable.ext.afnSortData[sDataType] ) - { - var aData = DataTable.ext.afnSortData[sDataType].call( - oSettings.oInstance, oSettings, iColumn, iVisColumn - ); - if ( aData.length === aoData.length ) - { - for ( j=0, jLen=aoData.length ; j<jLen ; j++ ) - { - _fnSetCellData( oSettings, j, iColumn, aData[j] ); - } - } - else - { - _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" ); - } - } - } - - /* Create a value - key array of the current row positions such that we can use their - * current position during the sort, if values match, in order to perform stable sorting - */ - for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ ) - { - aiOrig[ oSettings.aiDisplayMaster[i] ] = i; - } - - /* Build an internal data array which is specific to the sort, so we can get and prep - * the data to be sorted only once, rather than needing to do it every time the sorting - * function runs. This make the sorting function a very simple comparison - */ - var iSortLen = aaSort.length; - var fnSortFormat, aDataSort; - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - for ( j=0 ; j<iSortLen ; j++ ) - { - aDataSort = aoColumns[ aaSort[j][0] ].aDataSort; - - for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ ) - { - sDataType = aoColumns[ aDataSort[k] ].sType; - fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ]; - - aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ? - fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) : - _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ); - } - } - } - - /* Do the sort - here we want multi-column sorting based on a given data source (column) - * and sorting function (from oSort) in a certain direction. It's reasonably complex to - * follow on it's own, but this is what we want (example two column sorting): - * fnLocalSorting = function(a,b){ - * var iTest; - * iTest = oSort['string-asc']('data11', 'data12'); - * if (iTest !== 0) - * return iTest; - * iTest = oSort['numeric-desc']('data21', 'data22'); - * if (iTest !== 0) - * return iTest; - * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); - * } - * Basically we have a test for each sorting column, if the data in that column is equal, - * test the next column. If all columns match, then we use a numeric sort on the row - * positions in the original data array to provide a stable sort. - */ - oSettings.aiDisplayMaster.sort( function ( a, b ) { - var k, l, lLen, iTest, aDataSort, sDataType; - for ( k=0 ; k<iSortLen ; k++ ) - { - aDataSort = aoColumns[ aaSort[k][0] ].aDataSort; - - for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ ) - { - sDataType = aoColumns[ aDataSort[l] ].sType; - - iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ]( - aoData[a]._aSortData[ aDataSort[l] ], - aoData[b]._aSortData[ aDataSort[l] ] - ); - - if ( iTest !== 0 ) - { - return iTest; - } - } - } - - return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); - } ); - } - - /* Alter the sorting classes to take account of the changes */ - if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender ) - { - _fnSortingClasses( oSettings ); - } - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" ); - nTh = aoColumns[i].nTh; - nTh.removeAttribute('aria-sort'); - nTh.removeAttribute('aria-label'); - - /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ - if ( aoColumns[i].bSortable ) - { - if ( aaSort.length > 0 && aaSort[0][0] == i ) - { - nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); - - var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? - aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; - nTh.setAttribute('aria-label', sTitle+ - (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); - } - else - { - nTh.setAttribute('aria-label', sTitle+ - (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); - } - } - else - { - nTh.setAttribute('aria-label', sTitle); - } - } - - /* Tell the draw function that we have sorted the data */ - oSettings.bSorted = true; - $(oSettings.oInstance).trigger('sort', oSettings); - - /* Copy the master data into the draw array and re-draw */ - if ( oSettings.oFeatures.bFilter ) - { - /* _fnFilter() will redraw the table for us */ - _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); - } - else - { - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - oSettings._iDisplayStart = 0; /* reset display back to page 0 */ - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - } - - - /** - * Attach a sort handler (click) to a node - * @param {object} oSettings dataTables settings object - * @param {node} nNode node to attach the handler to - * @param {int} iDataIndex column sorting index - * @param {function} [fnCallback] callback function - * @memberof DataTable#oApi - */ - function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback ) - { - _fnBindAction( nNode, {}, function (e) { - /* If the column is not sortable - don't to anything */ - if ( oSettings.aoColumns[iDataIndex].bSortable === false ) - { - return; - } - - /* - * This is a little bit odd I admit... I declare a temporary function inside the scope of - * _fnBuildHead and the click handler in order that the code presented here can be used - * twice - once for when bProcessing is enabled, and another time for when it is - * disabled, as we need to perform slightly different actions. - * Basically the issue here is that the Javascript engine in modern browsers don't - * appear to allow the rendering engine to update the display while it is still excuting - * it's thread (well - it does but only after long intervals). This means that the - * 'processing' display doesn't appear for a table sort. To break the js thread up a bit - * I force an execution break by using setTimeout - but this breaks the expected - * thread continuation for the end-developer's point of view (their code would execute - * too early), so we on;y do it when we absolutely have to. - */ - var fnInnerSorting = function () { - var iColumn, iNextSort; - - /* If the shift key is pressed then we are multipe column sorting */ - if ( e.shiftKey ) - { - /* Are we already doing some kind of sort on this column? */ - var bFound = false; - for ( var i=0 ; i<oSettings.aaSorting.length ; i++ ) - { - if ( oSettings.aaSorting[i][0] == iDataIndex ) - { - bFound = true; - iColumn = oSettings.aaSorting[i][0]; - iNextSort = oSettings.aaSorting[i][2]+1; - - if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] ) - { - /* Reached the end of the sorting options, remove from multi-col sort */ - oSettings.aaSorting.splice( i, 1 ); - } - else - { - /* Move onto next sorting direction */ - oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort]; - oSettings.aaSorting[i][2] = iNextSort; - } - break; - } - } - - /* No sort yet - add it in */ - if ( bFound === false ) - { - oSettings.aaSorting.push( [ iDataIndex, - oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); - } - } - else - { - /* If no shift key then single column sort */ - if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex ) - { - iColumn = oSettings.aaSorting[0][0]; - iNextSort = oSettings.aaSorting[0][2]+1; - if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] ) - { - iNextSort = 0; - } - oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort]; - oSettings.aaSorting[0][2] = iNextSort; - } - else - { - oSettings.aaSorting.splice( 0, oSettings.aaSorting.length ); - oSettings.aaSorting.push( [ iDataIndex, - oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); - } - } - - /* Run the sort */ - _fnSort( oSettings ); - }; /* /fnInnerSorting */ - - if ( !oSettings.oFeatures.bProcessing ) - { - fnInnerSorting(); - } - else - { - _fnProcessingDisplay( oSettings, true ); - setTimeout( function() { - fnInnerSorting(); - if ( !oSettings.oFeatures.bServerSide ) - { - _fnProcessingDisplay( oSettings, false ); - } - }, 0 ); - } - - /* Call the user specified callback function - used for async user interaction */ - if ( typeof fnCallback == 'function' ) - { - fnCallback( oSettings ); - } - } ); - } - - - /** - * Set the sorting classes on the header, Note: it is safe to call this function - * when bSort and bSortClasses are false - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSortingClasses( oSettings ) - { - var i, iLen, j, jLen, iFound; - var aaSort, sClass; - var iColumns = oSettings.aoColumns.length; - var oClasses = oSettings.oClasses; - - for ( i=0 ; i<iColumns ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable ) - { - $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc + - " "+ oSettings.aoColumns[i].sSortingClass ); - } - } - - if ( oSettings.aaSortingFixed !== null ) - { - aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting ); - } - else - { - aaSort = oSettings.aaSorting.slice(); - } - - /* Apply the required classes to the header */ - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - if ( oSettings.aoColumns[i].bSortable ) - { - sClass = oSettings.aoColumns[i].sSortingClass; - iFound = -1; - for ( j=0 ; j<aaSort.length ; j++ ) - { - if ( aaSort[j][0] == i ) - { - sClass = ( aaSort[j][1] == "asc" ) ? - oClasses.sSortAsc : oClasses.sSortDesc; - iFound = j; - break; - } - } - $(oSettings.aoColumns[i].nTh).addClass( sClass ); - - if ( oSettings.bJUI ) - { - /* jQuery UI uses extra markup */ - var jqSpan = $("span."+oClasses.sSortIcon, oSettings.aoColumns[i].nTh); - jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ - oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed ); - - var sSpanClass; - if ( iFound == -1 ) - { - sSpanClass = oSettings.aoColumns[i].sSortingClassJUI; - } - else if ( aaSort[iFound][1] == "asc" ) - { - sSpanClass = oClasses.sSortJUIAsc; - } - else - { - sSpanClass = oClasses.sSortJUIDesc; - } - - jqSpan.addClass( sSpanClass ); - } - } - else - { - /* No sorting on this column, so add the base class. This will have been assigned by - * _fnAddColumn - */ - $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass ); - } - } - - /* - * Apply the required classes to the table body - * Note that this is given as a feature switch since it can significantly slow down a sort - * on large data sets (adding and removing of classes is always slow at the best of times..) - * Further to this, note that this code is admitadly fairly ugly. It could be made a lot - * simpiler using jQuery selectors and add/removeClass, but that is significantly slower - * (on the order of 5 times slower) - hence the direct DOM manipulation here. - * Note that for defered drawing we do use jQuery - the reason being that taking the first - * row found to see if the whole column needs processed can miss classes since the first - * column might be new. - */ - sClass = oClasses.sSortColumn; - - if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses ) - { - var nTds = _fnGetTdNodes( oSettings ); - - /* Remove the old classes */ - if ( oSettings.oFeatures.bDeferRender ) - { - $(nTds).removeClass(sClass+'1 '+sClass+'2 '+sClass+'3'); - } - else if ( nTds.length >= iColumns ) - { - for ( i=0 ; i<iColumns ; i++ ) - { - if ( nTds[i].className.indexOf(sClass+"1") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) ); - } - } - else if ( nTds[i].className.indexOf(sClass+"2") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) ); - } - } - else if ( nTds[i].className.indexOf(sClass+"3") != -1 ) - { - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+i].className = - $.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) ); - } - } - } - } - - /* Add the new classes to the table */ - var iClass = 1, iTargetCol; - for ( i=0 ; i<aaSort.length ; i++ ) - { - iTargetCol = parseInt( aaSort[i][0], 10 ); - for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ ) - { - nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass; - } - - if ( iClass < 3 ) - { - iClass++; - } - } - } - } - - - - /** - * Save the state of a table in a cookie such that the page can be reloaded - * @param {object} oSettings dataTables settings object - * @memberof DataTable#oApi - */ - function _fnSaveState ( oSettings ) - { - if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying ) - { - return; - } - - /* Store the interesting variables */ - var i, iLen, bInfinite=oSettings.oScroll.bInfinite; - var oState = { - "iCreate": new Date().getTime(), - "iStart": (bInfinite ? 0 : oSettings._iDisplayStart), - "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd), - "iLength": oSettings._iDisplayLength, - "aaSorting": $.extend( true, [], oSettings.aaSorting ), - "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ), - "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ), - "abVisCols": [] - }; - - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - oState.abVisCols.push( oSettings.aoColumns[i].bVisible ); - } - - _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] ); - - oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState ); - } - - - /** - * Attempt to load a saved table state from a cookie - * @param {object} oSettings dataTables settings object - * @param {object} oInit DataTables init object so we can override settings - * @memberof DataTable#oApi - */ - function _fnLoadState ( oSettings, oInit ) - { - if ( !oSettings.oFeatures.bStateSave ) - { - return; - } - - var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings ); - if ( !oData ) - { - return; - } - - /* Allow custom and plug-in manipulation functions to alter the saved data set and - * cancelling of loading by returning false - */ - var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] ); - if ( $.inArray( false, abStateLoad ) !== -1 ) - { - return; - } - - /* Store the saved state so it might be accessed at any time */ - oSettings.oLoadedState = $.extend( true, {}, oData ); - - /* Restore key features */ - oSettings._iDisplayStart = oData.iStart; - oSettings.iInitDisplayStart = oData.iStart; - oSettings._iDisplayEnd = oData.iEnd; - oSettings._iDisplayLength = oData.iLength; - oSettings.aaSorting = oData.aaSorting.slice(); - oSettings.saved_aaSorting = oData.aaSorting.slice(); - - /* Search filtering */ - $.extend( oSettings.oPreviousSearch, oData.oSearch ); - $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols ); - - /* Column visibility state - * Pass back visibiliy settings to the init handler, but to do not here override - * the init object that the user might have passed in - */ - oInit.saved_aoColumns = []; - for ( var i=0 ; i<oData.abVisCols.length ; i++ ) - { - oInit.saved_aoColumns[i] = {}; - oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i]; - } - - _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] ); - } - - - /** - * Create a new cookie with a value to store the state of a table - * @param {string} sName name of the cookie to create - * @param {string} sValue the value the cookie should take - * @param {int} iSecs duration of the cookie - * @param {string} sBaseName sName is made up of the base + file name - this is the base - * @param {function} fnCallback User definable function to modify the cookie - * @memberof DataTable#oApi - */ - function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback ) - { - var date = new Date(); - date.setTime( date.getTime()+(iSecs*1000) ); - - /* - * Shocking but true - it would appear IE has major issues with having the path not having - * a trailing slash on it. We need the cookie to be available based on the path, so we - * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the - * patch to use at least some of the path - */ - var aParts = window.location.pathname.split('/'); - var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase(); - var sFullCookie, oData; - - if ( fnCallback !== null ) - { - oData = (typeof $.parseJSON === 'function') ? - $.parseJSON( sValue ) : eval( '('+sValue+')' ); - sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(), - aParts.join('/')+"/" ); - } - else - { - sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) + - "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/"; - } - - /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies - * belonging to DataTables. This is FAR from bullet proof - */ - var sOldName="", iOldTime=9999999999999; - var iLength = _fnReadCookie( sNameFile )!==null ? document.cookie.length : - sFullCookie.length + document.cookie.length; - - if ( iLength+10 > 4096 ) /* Magic 10 for padding */ - { - var aCookies =document.cookie.split(';'); - for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ ) - { - if ( aCookies[i].indexOf( sBaseName ) != -1 ) - { - /* It's a DataTables cookie, so eval it and check the time stamp */ - var aSplitCookie = aCookies[i].split('='); - try { oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' ); } - catch( e ) { continue; } - - if ( oData.iCreate && oData.iCreate < iOldTime ) - { - sOldName = aSplitCookie[0]; - iOldTime = oData.iCreate; - } - } - } - - if ( sOldName !== "" ) - { - document.cookie = sOldName+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+ - aParts.join('/') + "/"; - } - } - - document.cookie = sFullCookie; - } - - - /** - * Read an old cookie to get a cookie with an old table state - * @param {string} sName name of the cookie to read - * @returns {string} contents of the cookie - or null if no cookie with that name found - * @memberof DataTable#oApi - */ - function _fnReadCookie ( sName ) - { - var - aParts = window.location.pathname.split('/'), - sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=', - sCookieContents = document.cookie.split(';'); - - for( var i=0 ; i<sCookieContents.length ; i++ ) - { - var c = sCookieContents[i]; - - while (c.charAt(0)==' ') - { - c = c.substring(1,c.length); - } - - if (c.indexOf(sNameEQ) === 0) - { - return decodeURIComponent( c.substring(sNameEQ.length,c.length) ); - } - } - return null; - } - - - - /** - * Return the settings object for a particular table - * @param {node} nTable table we are using as a dataTable - * @returns {object} Settings object - or null if not found - * @memberof DataTable#oApi - */ - function _fnSettingsFromNode ( nTable ) - { - for ( var i=0 ; i<DataTable.settings.length ; i++ ) - { - if ( DataTable.settings[i].nTable === nTable ) - { - return DataTable.settings[i]; - } - } - - return null; - } - - - /** - * Return an array with the TR nodes for the table - * @param {object} oSettings dataTables settings object - * @returns {array} TR array - * @memberof DataTable#oApi - */ - function _fnGetTrNodes ( oSettings ) - { - var aNodes = []; - var aoData = oSettings.aoData; - for ( var i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - aNodes.push( aoData[i].nTr ); - } - } - return aNodes; - } - - - /** - * Return an flat array with all TD nodes for the table, or row - * @param {object} oSettings dataTables settings object - * @param {int} [iIndividualRow] aoData index to get the nodes for - optional - * if not given then the return array will contain all nodes for the table - * @returns {array} TD array - * @memberof DataTable#oApi - */ - function _fnGetTdNodes ( oSettings, iIndividualRow ) - { - var anReturn = []; - var iCorrector; - var anTds; - var iRow, iRows=oSettings.aoData.length, - iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows; - - /* Allow the collection to be limited to just one row */ - if ( iIndividualRow !== undefined ) - { - iStart = iIndividualRow; - iEnd = iIndividualRow+1; - } - - for ( iRow=iStart ; iRow<iEnd ; iRow++ ) - { - oData = oSettings.aoData[iRow]; - if ( oData.nTr !== null ) - { - /* get the TD child nodes - taking into account text etc nodes */ - anTds = []; - for ( iColumn=0, iColumns=oData.nTr.childNodes.length ; iColumn<iColumns ; iColumn++ ) - { - sNodeName = oData.nTr.childNodes[iColumn].nodeName.toLowerCase(); - if ( sNodeName == 'td' || sNodeName == 'th' ) - { - anTds.push( oData.nTr.childNodes[iColumn] ); - } - } - - iCorrector = 0; - for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ ) - { - if ( oSettings.aoColumns[iColumn].bVisible ) - { - anReturn.push( anTds[iColumn-iCorrector] ); - } - else - { - anReturn.push( oData._anHidden[iColumn] ); - iCorrector++; - } - } - } - } - - return anReturn; - } - - - /** - * Log an error message - * @param {object} oSettings dataTables settings object - * @param {int} iLevel log error messages, or display them to the user - * @param {string} sMesg error message - * @memberof DataTable#oApi - */ - function _fnLog( oSettings, iLevel, sMesg ) - { - var sAlert = (oSettings===null) ? - "DataTables warning: "+sMesg : - "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg; - - if ( iLevel === 0 ) - { - if ( DataTable.ext.sErrMode == 'alert' ) - { - alert( sAlert ); - } - else - { - throw new Error(sAlert); - } - return; - } - else if ( window.console && console.log ) - { - console.log( sAlert ); - } - } - - - /** - * See if a property is defined on one object, if so assign it to the other object - * @param {object} oRet target object - * @param {object} oSrc source object - * @param {string} sName property - * @param {string} [sMappedName] name to map too - optional, sName used if not given - * @memberof DataTable#oApi - */ - function _fnMap( oRet, oSrc, sName, sMappedName ) - { - if ( sMappedName === undefined ) - { - sMappedName = sName; - } - if ( oSrc[sName] !== undefined ) - { - oRet[sMappedName] = oSrc[sName]; - } - } - - - /** - * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow - * copy arrays. The reason we need to do this, is that we don't want to deep copy array - * init values (such as aaSorting) since the dev wouldn't be able to override them, but - * we do want to deep copy arrays. - * @param {object} oOut Object to extend - * @param {object} oExtender Object from which the properties will be applied to oOut - * @returns {object} oOut Reference, just for convenience - oOut === the return. - * @memberof DataTable#oApi - * @todo This doesn't take account of arrays inside the deep copied objects. - */ - function _fnExtend( oOut, oExtender ) - { - for ( var prop in oExtender ) - { - if ( oExtender.hasOwnProperty(prop) ) - { - if ( typeof oInit[prop] === 'object' && $.isArray(oExtender[prop]) === false ) - { - $.extend( true, oOut[prop], oExtender[prop] ); - } - else - { - oOut[prop] = oExtender[prop]; - } - } - } - - return oOut; - } - - - /** - * Bind an event handers to allow a click or return key to activate the callback. - * This is good for accessability since a return on the keyboard will have the - * same effect as a click, if the element has focus. - * @param {element} n Element to bind the action to - * @param {object} oData Data object to pass to the triggered function - * @param {function} fn Callback function for when the event is triggered - * @memberof DataTable#oApi - */ - function _fnBindAction( n, oData, fn ) - { - $(n) - .bind( 'click.DT', oData, function (e) { - n.blur(); // Remove focus outline for mouse users - fn(e); - } ) - .bind( 'keypress.DT', oData, function (e){ - if ( e.which === 13 ) { - fn(e); - } } ) - .bind( 'selectstart.DT', function () { - /* Take the brutal approach to cancelling text selection */ - return false; - } ); - } - - - /** - * Register a callback function. Easily allows a callback function to be added to - * an array store of callback functions that can then all be called together. - * @param {object} oSettings dataTables settings object - * @param {string} sStore Name of the array storeage for the callbacks in oSettings - * @param {function} fn Function to be called back - * @param {string} sName Identifying name for the callback (i.e. a label) - * @memberof DataTable#oApi - */ - function _fnCallbackReg( oSettings, sStore, fn, sName ) - { - if ( fn ) - { - oSettings[sStore].push( { - "fn": fn, - "sName": sName - } ); - } - } - - - /** - * Fire callback functions and trigger events. Note that the loop over the callback - * array store is done backwards! Further note that you do not want to fire off triggers - * in time sensitive applications (for example cell creation) as its slow. - * @param {object} oSettings dataTables settings object - * @param {string} sStore Name of the array storeage for the callbacks in oSettings - * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger - * is fired - * @param {array} aArgs Array of arguments to pass to the callback function / trigger - * @memberof DataTable#oApi - */ - function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs ) - { - var aoStore = oSettings[sStore]; - var aRet =[]; - - for ( var i=aoStore.length-1 ; i>=0 ; i-- ) - { - aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) ); - } - - if ( sTrigger !== null ) - { - $(oSettings.oInstance).trigger(sTrigger, aArgs); - } - - return aRet; - } - - - /** - * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other - * library, then we use that as it is fast, safe and accurate. If the function isn't - * available then we need to built it ourselves - the insperation for this function comes - * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is - * not perfect and absolutely should not be used as a replacement to json2.js - but it does - * do what we need, without requiring a dependency for DataTables. - * @param {object} o JSON object to be converted - * @returns {string} JSON string - * @memberof DataTable#oApi - */ - var _fnJsonString = (window.JSON) ? JSON.stringify : function( o ) - { - /* Not an object or array */ - var sType = typeof o; - if (sType !== "object" || o === null) - { - // simple data type - if (sType === "string") - { - o = '"'+o+'"'; - } - return o+""; - } - - /* If object or array, need to recurse over it */ - var - sProp, mValue, - json = [], - bArr = $.isArray(o); - - for (sProp in o) - { - mValue = o[sProp]; - sType = typeof mValue; - - if (sType === "string") - { - mValue = '"'+mValue+'"'; - } - else if (sType === "object" && mValue !== null) - { - mValue = _fnJsonString(mValue); - } - - json.push((bArr ? "" : '"'+sProp+'":') + mValue); - } - - return (bArr ? "[" : "{") + json + (bArr ? "]" : "}"); - }; - - - - - /** - * Perform a jQuery selector action on the table's TR elements (from the tbody) and - * return the resulting jQuery object. - * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on - * @param {object} [oOpts] Optional parameters for modifying the rows to be included - * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter - * criterion ("applied") or all TR elements (i.e. no filter). - * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. - * Can be either 'current', whereby the current sorting of the table is used, or - * 'original' whereby the original order the data was read into the table is used. - * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be - * 'current' and filter is 'applied', regardless of what they might be given as. - * @returns {object} jQuery object, filtered by the given selector. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Highlight every second row - * oTable.$('tr:odd').css('backgroundColor', 'blue'); - * } ); - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Filter to rows with 'Webkit' in them, add a background colour and then - * // remove the filter, thus highlighting the 'Webkit' rows only. - * oTable.fnFilter('Webkit'); - * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue'); - * oTable.fnFilter(''); - * } ); - */ - this.$ = function ( sSelector, oOpts ) - { - var i, iLen, a = [], tr; - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var aoData = oSettings.aoData; - var aiDisplay = oSettings.aiDisplay; - var aiDisplayMaster = oSettings.aiDisplayMaster; - - if ( !oOpts ) - { - oOpts = {}; - } - - oOpts = $.extend( {}, { - "filter": "none", // applied - "order": "current", // "original" - "page": "all" // current - }, oOpts ); - - // Current page implies that order=current and fitler=applied, since it is fairly - // senseless otherwise - if ( oOpts.page == 'current' ) - { - for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplay[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "current" && oOpts.filter == "none" ) - { - for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplayMaster[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "current" && oOpts.filter == "applied" ) - { - for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ ) - { - tr = aoData[ aiDisplay[i] ].nTr; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "original" && oOpts.filter == "none" ) - { - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - tr = aoData[ i ].nTr ; - if ( tr ) - { - a.push( tr ); - } - } - } - else if ( oOpts.order == "original" && oOpts.filter == "applied" ) - { - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - tr = aoData[ i ].nTr; - if ( $.inArray( i, aiDisplay ) !== -1 && tr ) - { - a.push( tr ); - } - } - } - else - { - _fnLog( oSettings, 1, "Unknown selection options" ); - } - - /* We need to filter on the TR elements and also 'find' in their descendants - * to make the selector act like it would in a full table - so we need - * to build both results and then combine them together - */ - var jqA = $(a); - var jqTRs = jqA.filter( sSelector ); - var jqDescendants = jqA.find( sSelector ); - - return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) ); - }; - - - /** - * Almost identical to $ in operation, but in this case returns the data for the matched - * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes - * rather than any decendents, so the data can be obtained for the row/cell. If matching - * rows are found, the data returned is the original data array/object that was used to - * create the row (or a generated array if from a DOM source). - * - * This method is often useful incombination with $ where both functions are given the - * same parameters and the array indexes will match identically. - * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on - * @param {object} [oOpts] Optional parameters for modifying the rows to be included - * @param {string} [oOpts.filter=none] Select elements that meet the current filter - * criterion ("applied") or all elements (i.e. no filter). - * @param {string} [oOpts.order=current] Order of the data in the processed array. - * Can be either 'current', whereby the current sorting of the table is used, or - * 'original' whereby the original order the data was read into the table is used. - * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be - * 'current' and filter is 'applied', regardless of what they might be given as. - * @returns {array} Data for the matched elements. If any elements, as a result of the - * selector, were not TR, TD or TH elements in the DataTable, they will have a null - * entry in the array. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Get the data from the first row in the table - * var data = oTable._('tr:first'); - * - * // Do something useful with the data - * alert( "First cell is: "+data[0] ); - * } ); - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Filter to 'Webkit' and get all data for - * oTable.fnFilter('Webkit'); - * var data = oTable._('tr', {"filter": "applied"}); - * - * // Do something with the data - * alert( data.length+" rows matched the filter" ); - * } ); - */ - this._ = function ( sSelector, oOpts ) - { - var aOut = []; - var i, iLen, iIndex; - var aTrs = this.$( sSelector, oOpts ); - - for ( i=0, iLen=aTrs.length ; i<iLen ; i++ ) - { - aOut.push( this.fnGetData(aTrs[i]) ); - } - - return aOut; - }; - - - /** - * Add a single new row or multiple rows of data to the table. Please note - * that this is suitable for client-side processing only - if you are using - * server-side processing (i.e. "bServerSide": true), then to add data, you - * must add it to the data source, i.e. the server-side, through an Ajax call. - * @param {array|object} mData The data to be added to the table. This can be: - * <ul> - * <li>1D array of data - add a single row with the data provided</li> - * <li>2D array of arrays - add multiple rows in a single call</li> - * <li>object - data object when using <i>mDataProp</i></li> - * <li>array of objects - multiple data objects when using <i>mDataProp</i></li> - * </ul> - * @param {bool} [bRedraw=true] redraw the table or not - * @returns {array} An array of integers, representing the list of indexes in - * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to - * the table. - * @dtopt API - * - * @example - * // Global var for counter - * var giCount = 2; - * - * $(document).ready(function() { - * $('#example').dataTable(); - * } ); - * - * function fnClickAddRow() { - * $('#example').dataTable().fnAddData( [ - * giCount+".1", - * giCount+".2", - * giCount+".3", - * giCount+".4" ] - * ); - * - * giCount++; - * } - */ - this.fnAddData = function( mData, bRedraw ) - { - if ( mData.length === 0 ) - { - return []; - } - - var aiReturn = []; - var iTest; - - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - /* Check if we want to add multiple rows or not */ - if ( typeof mData[0] === "object" && mData[0] !== null ) - { - for ( var i=0 ; i<mData.length ; i++ ) - { - iTest = _fnAddData( oSettings, mData[i] ); - if ( iTest == -1 ) - { - return aiReturn; - } - aiReturn.push( iTest ); - } - } - else - { - iTest = _fnAddData( oSettings, mData ); - if ( iTest == -1 ) - { - return aiReturn; - } - aiReturn.push( iTest ); - } - - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - if ( bRedraw === undefined || bRedraw ) - { - _fnReDraw( oSettings ); - } - return aiReturn; - }; - - - /** - * This function will make DataTables recalculate the column sizes, based on the data - * contained in the table and the sizes applied to the columns (in the DOM, CSS or - * through the sWidth parameter). This can be useful when the width of the table's - * parent element changes (for example a window resize). - * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * - * $(window).bind('resize', function () { - * oTable.fnAdjustColumnSizing(); - * } ); - * } ); - */ - this.fnAdjustColumnSizing = function ( bRedraw ) - { - var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]); - _fnAdjustColumnSizing( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - this.fnDraw( false ); - } - else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) - { - /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */ - this.oApi._fnScrollDraw(oSettings); - } - }; - - - /** - * Quickly and simply clear a table - * @param {bool} [bRedraw=true] redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...) - * oTable.fnClearTable(); - * } ); - */ - this.fnClearTable = function( bRedraw ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - _fnClearTable( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - _fnDraw( oSettings ); - } - }; - - - /** - * The exact opposite of 'opening' a row, this function will close any rows which - * are currently 'open'. - * @param {node} nTr the table row to 'close' - * @returns {int} 0 on success, or 1 if failed (can't find the row) - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnClose = function( nTr ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ ) - { - if ( oSettings.aoOpenRows[i].nParent == nTr ) - { - var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode; - if ( nTrParent ) - { - /* Remove it if it is currently on display */ - nTrParent.removeChild( oSettings.aoOpenRows[i].nTr ); - } - oSettings.aoOpenRows.splice( i, 1 ); - return 0; - } - } - return 1; - }; - - - /** - * Remove a row for the table - * @param {mixed} mTarget The index of the row from aoData to be deleted, or - * the TR element you want to delete - * @param {function|null} [fnCallBack] Callback function - * @param {bool} [bRedraw=true] Redraw the table or not - * @returns {array} The row that was deleted - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Immediately remove the first row - * oTable.fnDeleteRow( 0 ); - * } ); - */ - this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen, iAODataIndex; - - iAODataIndex = (typeof mTarget === 'object') ? - _fnNodeToDataIndex(oSettings, mTarget) : mTarget; - - /* Return the data array from this row */ - var oData = oSettings.aoData.splice( iAODataIndex, 1 ); - - /* Update the _DT_RowIndex parameter */ - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - if ( oSettings.aoData[i].nTr !== null ) - { - oSettings.aoData[i].nTr._DT_RowIndex = i; - } - } - - /* Remove the target row from the search array */ - var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay ); - oSettings.asDataSearch.splice( iDisplayIndex, 1 ); - - /* Delete from the display arrays */ - _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex ); - _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex ); - - /* If there is a user callback function - call it */ - if ( typeof fnCallBack === "function" ) - { - fnCallBack.call( this, oSettings, oData ); - } - - /* Check for an 'overflow' they case for displaying the table */ - if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() ) - { - oSettings._iDisplayStart -= oSettings._iDisplayLength; - if ( oSettings._iDisplayStart < 0 ) - { - oSettings._iDisplayStart = 0; - } - } - - if ( bRedraw === undefined || bRedraw ) - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - - return oData; - }; - - - /** - * Restore the table to it's original state in the DOM by removing all of DataTables - * enhancements, alterations to the DOM structure of the table and event listeners. - * @param {boolean} [bRemove=false] Completely remove the table from the DOM - * @dtopt API - * - * @example - * $(document).ready(function() { - * // This example is fairly pointless in reality, but shows how fnDestroy can be used - * var oTable = $('#example').dataTable(); - * oTable.fnDestroy(); - * } ); - */ - this.fnDestroy = function ( bRemove ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var nOrig = oSettings.nTableWrapper.parentNode; - var nBody = oSettings.nTBody; - var i, iLen; - - bRemove = (bRemove===undefined) ? false : true; - - /* Flag to note that the table is currently being destroyed - no action should be taken */ - oSettings.bDestroying = true; - - /* Fire off the destroy callbacks for plug-ins etc */ - _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] ); - - /* Restore hidden columns */ - for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) - { - if ( oSettings.aoColumns[i].bVisible === false ) - { - this.fnSetColumnVis( i, true ); - } - } - - /* Blitz all DT events */ - $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT'); - - /* If there is an 'empty' indicator row, remove it */ - $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove(); - - /* When scrolling we had to break the table up - restore it */ - if ( oSettings.nTable != oSettings.nTHead.parentNode ) - { - $(oSettings.nTable).children('thead').remove(); - oSettings.nTable.appendChild( oSettings.nTHead ); - } - - if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode ) - { - $(oSettings.nTable).children('tfoot').remove(); - oSettings.nTable.appendChild( oSettings.nTFoot ); - } - - /* Remove the DataTables generated nodes, events and classes */ - oSettings.nTable.parentNode.removeChild( oSettings.nTable ); - $(oSettings.nTableWrapper).remove(); - - oSettings.aaSorting = []; - oSettings.aaSortingFixed = []; - _fnSortingClasses( oSettings ); - - $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') ); - - $('th, td', oSettings.nTHead).removeClass( [ - oSettings.oClasses.sSortable, - oSettings.oClasses.sSortableAsc, - oSettings.oClasses.sSortableDesc, - oSettings.oClasses.sSortableNone ].join(' ') - ); - if ( oSettings.bJUI ) - { - $('th span.'+oSettings.oClasses.sSortIcon - + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove(); - - $('th, td', oSettings.nTHead).each( function () { - var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this); - var kids = jqWrapper.contents(); - $(this).append( kids ); - jqWrapper.remove(); - } ); - } - - /* Add the TR elements back into the table in their original order */ - if ( !bRemove && oSettings.nTableReinsertBefore ) - { - nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore ); - } - else if ( !bRemove ) - { - nOrig.appendChild( oSettings.nTable ); - } - - for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) - { - if ( oSettings.aoData[i].nTr !== null ) - { - nBody.appendChild( oSettings.aoData[i].nTr ); - } - } - - /* Restore the width of the original table */ - if ( oSettings.oFeatures.bAutoWidth === true ) - { - oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth); - } - - /* If the were originally odd/even type classes - then we add them back here. Note - * this is not fool proof (for example if not all rows as odd/even classes - but - * it's a good effort without getting carried away - */ - $(nBody).children('tr:even').addClass( oSettings.asDestroyStripes[0] ); - $(nBody).children('tr:odd').addClass( oSettings.asDestroyStripes[1] ); - - /* Remove the settings object from the settings array */ - for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ ) - { - if ( DataTable.settings[i] == oSettings ) - { - DataTable.settings.splice( i, 1 ); - } - } - - /* End it all */ - oSettings = null; - }; - - - /** - * Redraw the table - * @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Re-draw the table - you wouldn't want to do it here, but it's an example :-) - * oTable.fnDraw(); - * } ); - */ - this.fnDraw = function( bComplete ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - if ( bComplete === false ) - { - _fnCalculateEnd( oSettings ); - _fnDraw( oSettings ); - } - else - { - _fnReDraw( oSettings ); - } - }; - - - /** - * Filter the input based on data - * @param {string} sInput String to filter the table on - * @param {int|null} [iColumn] Column to limit filtering to - * @param {bool} [bRegex=false] Treat as regular expression or not - * @param {bool} [bSmart=true] Perform smart filtering or not - * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es) - * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false) - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sometime later - filter... - * oTable.fnFilter( 'test string' ); - * } ); - */ - this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( !oSettings.oFeatures.bFilter ) - { - return; - } - - if ( bRegex === undefined || bRegex === null ) - { - bRegex = false; - } - - if ( bSmart === undefined || bSmart === null ) - { - bSmart = true; - } - - if ( bShowGlobal === undefined || bShowGlobal === null ) - { - bShowGlobal = true; - } - - if ( bCaseInsensitive === undefined || bCaseInsensitive === null ) - { - bCaseInsensitive = true; - } - - if ( iColumn === undefined || iColumn === null ) - { - /* Global filter */ - _fnFilterComplete( oSettings, { - "sSearch":sInput+"", - "bRegex": bRegex, - "bSmart": bSmart, - "bCaseInsensitive": bCaseInsensitive - }, 1 ); - - if ( bShowGlobal && oSettings.aanFeatures.f ) - { - var n = oSettings.aanFeatures.f; - for ( var i=0, iLen=n.length ; i<iLen ; i++ ) - { - $(n[i]._DT_Input).val( sInput ); - } - } - } - else - { - /* Single column filter */ - $.extend( oSettings.aoPreSearchCols[ iColumn ], { - "sSearch": sInput+"", - "bRegex": bRegex, - "bSmart": bSmart, - "bCaseInsensitive": bCaseInsensitive - } ); - _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); - } - }; - - - /** - * Get the data for the whole table, an individual row or an individual cell based on the - * provided parameters. - * @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as - * a TR node then the data source for the whole row will be returned. If given as a - * TD/TH cell node then iCol will be automatically calculated and the data for the - * cell returned. If given as an integer, then this is treated as the aoData internal - * data index for the row (see fnGetPosition) and the data for that row used. - * @param {int} [iCol] Optional column index that you want the data of. - * @returns {array|object|string} If mRow is undefined, then the data for all rows is - * returned. If mRow is defined, just data for that row, and is iCol is - * defined, only data for the designated cell is returned. - * @dtopt API - * - * @example - * // Row data - * $(document).ready(function() { - * oTable = $('#example').dataTable(); - * - * oTable.$('tr').click( function () { - * var data = oTable.fnGetData( this ); - * // ... do something with the array / object of data for the row - * } ); - * } ); - * - * @example - * // Individual cell data - * $(document).ready(function() { - * oTable = $('#example').dataTable(); - * - * oTable.$('td').click( function () { - * var sData = oTable.fnGetData( this ); - * alert( 'The cell clicked on had the value of '+sData ); - * } ); - * } ); - */ - this.fnGetData = function( mRow, iCol ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( mRow !== undefined ) - { - var iRow = mRow; - if ( typeof mRow === 'object' ) - { - var sNode = mRow.nodeName.toLowerCase(); - if (sNode === "tr" ) - { - iRow = _fnNodeToDataIndex(oSettings, mRow); - } - else if ( sNode === "td" ) - { - iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode); - iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow ); - } - } - - if ( iCol !== undefined ) - { - return _fnGetCellData( oSettings, iRow, iCol, '' ); - } - return (oSettings.aoData[iRow]!==undefined) ? - oSettings.aoData[iRow]._aData : null; - } - return _fnGetDataMaster( oSettings ); - }; - - - /** - * Get an array of the TR nodes that are used in the table's body. Note that you will - * typically want to use the '$' API method in preference to this as it is more - * flexible. - * @param {int} [iRow] Optional row index for the TR element you want - * @returns {array|node} If iRow is undefined, returns an array of all TR elements - * in the table's body, or iRow is defined, just the TR element requested. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Get the nodes from the table - * var nNodes = oTable.fnGetNodes( ); - * } ); - */ - this.fnGetNodes = function( iRow ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - if ( iRow !== undefined ) { - return (oSettings.aoData[iRow]!==undefined) ? - oSettings.aoData[iRow].nTr : null; - } - return _fnGetTrNodes( oSettings ); - }; - - - /** - * Get the array indexes of a particular cell from it's DOM element - * and column index including hidden columns - * @param {node} nNode this can either be a TR, TD or TH in the table's body - * @returns {int} If nNode is given as a TR, then a single index is returned, or - * if given as a cell, an array of [row index, column index (visible)] is given. - * @dtopt API - * - * @example - * $(document).ready(function() { - * $('#example tbody td').click( function () { - * // Get the position of the current data from the node - * var aPos = oTable.fnGetPosition( this ); - * - * // Get the data array for this row - * var aData = oTable.fnGetData( aPos[0] ); - * - * // Update the data array and return the value - * aData[ aPos[1] ] = 'clicked'; - * this.innerHTML = 'clicked'; - * } ); - * - * // Init DataTables - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnGetPosition = function( nNode ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var sNodeName = nNode.nodeName.toUpperCase(); - - if ( sNodeName == "TR" ) - { - return _fnNodeToDataIndex(oSettings, nNode); - } - else if ( sNodeName == "TD" || sNodeName == "TH" ) - { - var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode ); - var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode ); - return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ]; - } - return null; - }; - - - /** - * Check to see if a row is 'open' or not. - * @param {node} nTr the table row to check - * @returns {boolean} true if the row is currently open, false otherwise - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnIsOpen = function( nTr ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var aoOpenRows = oSettings.aoOpenRows; - - for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ ) - { - if ( oSettings.aoOpenRows[i].nParent == nTr ) - { - return true; - } - } - return false; - }; - - - /** - * This function will place a new row directly after a row which is currently - * on display on the page, with the HTML contents that is passed into the - * function. This can be used, for example, to ask for confirmation that a - * particular record should be deleted. - * @param {node} nTr The table row to 'open' - * @param {string|node|jQuery} mHtml The HTML to put into the row - * @param {string} sClass Class to give the new TD cell - * @returns {node} The row opened. Note that if the table row passed in as the - * first parameter, is not found in the table, this method will silently - * return. - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable; - * - * // 'open' an information row when a row is clicked on - * $('#example tbody tr').click( function () { - * if ( oTable.fnIsOpen(this) ) { - * oTable.fnClose( this ); - * } else { - * oTable.fnOpen( this, "Temporary row opened", "info_row" ); - * } - * } ); - * - * oTable = $('#example').dataTable(); - * } ); - */ - this.fnOpen = function( nTr, mHtml, sClass ) - { - /* Find settings from table node */ - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - - /* Check that the row given is in the table */ - var nTableRows = _fnGetTrNodes( oSettings ); - if ( $.inArray(nTr, nTableRows) === -1 ) - { - return; - } - - /* the old open one if there is one */ - this.fnClose( nTr ); - - var nNewRow = document.createElement("tr"); - var nNewCell = document.createElement("td"); - nNewRow.appendChild( nNewCell ); - nNewCell.className = sClass; - nNewCell.colSpan = _fnVisbleColumns( oSettings ); - - if (typeof mHtml === "string") - { - nNewCell.innerHTML = mHtml; - } - else - { - $(nNewCell).html( mHtml ); - } - - /* If the nTr isn't on the page at the moment - then we don't insert at the moment */ - var nTrs = $('tr', oSettings.nTBody); - if ( $.inArray(nTr, nTrs) != -1 ) - { - $(nNewRow).insertAfter(nTr); - } - - oSettings.aoOpenRows.push( { - "nTr": nNewRow, - "nParent": nTr - } ); - - return nNewRow; - }; - - - /** - * Change the pagination - provides the internal logic for pagination in a simple API - * function. With this function you can have a DataTables table go to the next, - * previous, first or last pages. - * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" - * or page number to jump to (integer), note that page 0 is the first page. - * @param {bool} [bRedraw=true] Redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * oTable.fnPageChange( 'next' ); - * } ); - */ - this.fnPageChange = function ( mAction, bRedraw ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - _fnPageChange( oSettings, mAction ); - _fnCalculateEnd( oSettings ); - - if ( bRedraw === undefined || bRedraw ) - { - _fnDraw( oSettings ); - } - }; - - - /** - * Show a particular column - * @param {int} iCol The column whose display should be changed - * @param {bool} bShow Show (true) or hide (false) the column - * @param {bool} [bRedraw=true] Redraw the table or not - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Hide the second column after initialisation - * oTable.fnSetColumnVis( 1, false ); - * } ); - */ - this.fnSetColumnVis = function ( iCol, bShow, bRedraw ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen; - var aoColumns = oSettings.aoColumns; - var aoData = oSettings.aoData; - var nTd, bAppend, iBefore; - - /* No point in doing anything if we are requesting what is already true */ - if ( aoColumns[iCol].bVisible == bShow ) - { - return; - } - - /* Show the column */ - if ( bShow ) - { - var iInsert = 0; - for ( i=0 ; i<iCol ; i++ ) - { - if ( aoColumns[i].bVisible ) - { - iInsert++; - } - } - - /* Need to decide if we should use appendChild or insertBefore */ - bAppend = (iInsert >= _fnVisbleColumns( oSettings )); - - /* Which coloumn should we be inserting before? */ - if ( !bAppend ) - { - for ( i=iCol ; i<aoColumns.length ; i++ ) - { - if ( aoColumns[i].bVisible ) - { - iBefore = i; - break; - } - } - } - - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - if ( bAppend ) - { - aoData[i].nTr.appendChild( - aoData[i]._anHidden[iCol] - ); - } - else - { - aoData[i].nTr.insertBefore( - aoData[i]._anHidden[iCol], - _fnGetTdNodes( oSettings, i )[iBefore] ); - } - } - } - } - else - { - /* Remove a column from display */ - for ( i=0, iLen=aoData.length ; i<iLen ; i++ ) - { - if ( aoData[i].nTr !== null ) - { - nTd = _fnGetTdNodes( oSettings, i )[iCol]; - aoData[i]._anHidden[iCol] = nTd; - nTd.parentNode.removeChild( nTd ); - } - } - } - - /* Clear to set the visible flag */ - aoColumns[iCol].bVisible = bShow; - - /* Redraw the header and footer based on the new column visibility */ - _fnDrawHead( oSettings, oSettings.aoHeader ); - if ( oSettings.nTFoot ) - { - _fnDrawHead( oSettings, oSettings.aoFooter ); - } - - /* If there are any 'open' rows, then we need to alter the colspan for this col change */ - for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ ) - { - oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings ); - } - - /* Do a redraw incase anything depending on the table columns needs it - * (built-in: scrolling) - */ - if ( bRedraw === undefined || bRedraw ) - { - _fnAdjustColumnSizing( oSettings ); - _fnDraw( oSettings ); - } - - _fnSaveState( oSettings ); - }; - - - /** - * Get the settings for a particular table for external manipulation - * @returns {object} DataTables settings object. See - * {@link DataTable.models.oSettings} - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * var oSettings = oTable.fnSettings(); - * - * // Show an example parameter from the settings - * alert( oSettings._iDisplayStart ); - * } ); - */ - this.fnSettings = function() - { - return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - }; - - - /** - * Sort the table by a particular column - * @param {int} iCol the data index to sort on. Note that this will not match the - * 'display index' if you have hidden data entries - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sort immediately with columns 0 and 1 - * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] ); - * } ); - */ - this.fnSort = function( aaSort ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - oSettings.aaSorting = aaSort; - _fnSort( oSettings ); - }; - - - /** - * Attach a sort listener to an element for a given column - * @param {node} nNode the element to attach the sort listener to - * @param {int} iColumn the column that a click on this node will sort on - * @param {function} [fnCallback] callback function when sort is run - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * - * // Sort on column 1, when 'sorter' is clicked on - * oTable.fnSortListener( document.getElementById('sorter'), 1 ); - * } ); - */ - this.fnSortListener = function( nNode, iColumn, fnCallback ) - { - _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn, - fnCallback ); - }; - - - /** - * Update a table cell or row - this method will accept either a single value to - * update the cell with, an array of values with one element for each column or - * an object in the same format as the original data source. The function is - * self-referencing in order to make the multi column updates easier. - * @param {object|array|string} mData Data to update the cell/row with - * @param {node|int} mRow TR element you want to update or the aoData index - * @param {int} [iColumn] The column to update (not used of mData is an array or object) - * @param {bool} [bRedraw=true] Redraw the table or not - * @param {bool} [bAction=true] Perform predraw actions or not - * @returns {int} 0 on success, 1 on error - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell - * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row - * } ); - */ - this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction ) - { - var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iLen, sDisplay; - var iRow = (typeof mRow === 'object') ? - _fnNodeToDataIndex(oSettings, mRow) : mRow; - - if ( oSettings.__fnUpdateDeep === undefined && $.isArray(mData) && typeof mData === 'object' ) - { - /* Array update - update the whole row */ - oSettings.aoData[iRow]._aData = mData.slice(); - - /* Flag to the function that we are recursing */ - oSettings.__fnUpdateDeep = true; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false ); - } - oSettings.__fnUpdateDeep = undefined; - } - else if ( oSettings.__fnUpdateDeep === undefined && mData !== null && typeof mData === 'object' ) - { - /* Object update - update the whole row - assume the developer gets the object right */ - oSettings.aoData[iRow]._aData = $.extend( true, {}, mData ); - - oSettings.__fnUpdateDeep = true; - for ( i=0 ; i<oSettings.aoColumns.length ; i++ ) - { - this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false ); - } - oSettings.__fnUpdateDeep = undefined; - } - else - { - /* Individual cell update */ - _fnSetCellData( oSettings, iRow, iColumn, mData ); - sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' ); - - var oCol = oSettings.aoColumns[iColumn]; - if ( oCol.fnRender !== null ) - { - sDisplay = _fnRender( oSettings, iRow, iColumn ); - if ( oCol.bUseRendered ) - { - _fnSetCellData( oSettings, iRow, iColumn, sDisplay ); - } - } - - if ( oSettings.aoData[iRow].nTr !== null ) - { - /* Do the actual HTML update */ - _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay; - } - } - - /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw - * will rebuild the search array - however, the redraw might be disabled by the user) - */ - var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay ); - oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings, - _fnGetRowData( oSettings, iRow, 'filter' ) ); - - /* Perform pre-draw actions */ - if ( bAction === undefined || bAction ) - { - _fnAdjustColumnSizing( oSettings ); - } - - /* Redraw the table */ - if ( bRedraw === undefined || bRedraw ) - { - _fnReDraw( oSettings ); - } - return 0; - }; - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, in order - * to ensure compatibility. - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the - * formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the required - * version, or false if this version of DataTales is not suitable - * @method - * @dtopt API - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * alert( oTable.fnVersionCheck( '1.9.0' ) ); - * } ); - */ - this.fnVersionCheck = DataTable.ext.fnVersionCheck; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publically... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} sFunc API function name - * @returns {function} wrapped function - * @memberof DataTable#oApi - */ - function _fnExternApiFunc (sFunc) - { - return function() { - var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( - Array.prototype.slice.call(arguments) ); - return DataTable.ext.oApi[sFunc].apply( this, aArgs ); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that these - * methods are references to internal functions and are considered to be private. - * If you use these methods, be aware that they are liable to change between versions - * (check the upgrade notes). - * @namespace - */ - this.oApi = { - "_fnExternApiFunc": _fnExternApiFunc, - "_fnInitialise": _fnInitialise, - "_fnInitComplete": _fnInitComplete, - "_fnLanguageCompat": _fnLanguageCompat, - "_fnAddColumn": _fnAddColumn, - "_fnColumnOptions": _fnColumnOptions, - "_fnAddData": _fnAddData, - "_fnCreateTr": _fnCreateTr, - "_fnGatherData": _fnGatherData, - "_fnBuildHead": _fnBuildHead, - "_fnDrawHead": _fnDrawHead, - "_fnDraw": _fnDraw, - "_fnReDraw": _fnReDraw, - "_fnAjaxUpdate": _fnAjaxUpdate, - "_fnAjaxParameters": _fnAjaxParameters, - "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw, - "_fnServerParams": _fnServerParams, - "_fnAddOptionsHtml": _fnAddOptionsHtml, - "_fnFeatureHtmlTable": _fnFeatureHtmlTable, - "_fnScrollDraw": _fnScrollDraw, - "_fnAdjustColumnSizing": _fnAdjustColumnSizing, - "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter, - "_fnFilterComplete": _fnFilterComplete, - "_fnFilterCustom": _fnFilterCustom, - "_fnFilterColumn": _fnFilterColumn, - "_fnFilter": _fnFilter, - "_fnBuildSearchArray": _fnBuildSearchArray, - "_fnBuildSearchRow": _fnBuildSearchRow, - "_fnFilterCreateSearch": _fnFilterCreateSearch, - "_fnDataToSearch": _fnDataToSearch, - "_fnSort": _fnSort, - "_fnSortAttachListener": _fnSortAttachListener, - "_fnSortingClasses": _fnSortingClasses, - "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate, - "_fnPageChange": _fnPageChange, - "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo, - "_fnUpdateInfo": _fnUpdateInfo, - "_fnFeatureHtmlLength": _fnFeatureHtmlLength, - "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing, - "_fnProcessingDisplay": _fnProcessingDisplay, - "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex, - "_fnColumnIndexToVisible": _fnColumnIndexToVisible, - "_fnNodeToDataIndex": _fnNodeToDataIndex, - "_fnVisbleColumns": _fnVisbleColumns, - "_fnCalculateEnd": _fnCalculateEnd, - "_fnConvertToWidth": _fnConvertToWidth, - "_fnCalculateColumnWidths": _fnCalculateColumnWidths, - "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust, - "_fnGetWidestNode": _fnGetWidestNode, - "_fnGetMaxLenString": _fnGetMaxLenString, - "_fnStringToCss": _fnStringToCss, - "_fnDetectType": _fnDetectType, - "_fnSettingsFromNode": _fnSettingsFromNode, - "_fnGetDataMaster": _fnGetDataMaster, - "_fnGetTrNodes": _fnGetTrNodes, - "_fnGetTdNodes": _fnGetTdNodes, - "_fnEscapeRegex": _fnEscapeRegex, - "_fnDeleteIndex": _fnDeleteIndex, - "_fnReOrderIndex": _fnReOrderIndex, - "_fnColumnOrdering": _fnColumnOrdering, - "_fnLog": _fnLog, - "_fnClearTable": _fnClearTable, - "_fnSaveState": _fnSaveState, - "_fnLoadState": _fnLoadState, - "_fnCreateCookie": _fnCreateCookie, - "_fnReadCookie": _fnReadCookie, - "_fnDetectHeader": _fnDetectHeader, - "_fnGetUniqueThs": _fnGetUniqueThs, - "_fnScrollBarWidth": _fnScrollBarWidth, - "_fnApplyToChildren": _fnApplyToChildren, - "_fnMap": _fnMap, - "_fnGetRowData": _fnGetRowData, - "_fnGetCellData": _fnGetCellData, - "_fnSetCellData": _fnSetCellData, - "_fnGetObjectDataFn": _fnGetObjectDataFn, - "_fnSetObjectDataFn": _fnSetObjectDataFn, - "_fnApplyColumnDefs": _fnApplyColumnDefs, - "_fnBindAction": _fnBindAction, - "_fnExtend": _fnExtend, - "_fnCallbackReg": _fnCallbackReg, - "_fnCallbackFire": _fnCallbackFire, - "_fnJsonString": _fnJsonString, - "_fnRender": _fnRender, - "_fnNodeToColumnIndex": _fnNodeToColumnIndex, - "_fnInfoMacros": _fnInfoMacros - }; - - $.extend( DataTable.ext.oApi, this.oApi ); - - for ( var sFunc in DataTable.ext.oApi ) - { - if ( sFunc ) - { - this[sFunc] = _fnExternApiFunc(sFunc); - } - } - - - var _that = this; - return this.each(function() { - - var i=0, iLen, j, jLen, k, kLen; - var sId = this.getAttribute( 'id' ); - var bInitHandedOff = false; - var bUsePassedData = false; - - - /* Sanity check */ - if ( this.nodeName.toLowerCase() != 'table' ) - { - _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+ - "table: "+this.nodeName ); - return; - } - - /* Check to see if we are re-initialising a table */ - for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ ) - { - /* Base check on table node */ - if ( DataTable.settings[i].nTable == this ) - { - if ( oInit === undefined || oInit.bRetrieve ) - { - return DataTable.settings[i].oInstance; - } - else if ( oInit.bDestroy ) - { - DataTable.settings[i].oInstance.fnDestroy(); - break; - } - else - { - _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+ - "To retrieve the DataTables object for this table, pass no arguments or see "+ - "the docs for bRetrieve and bDestroy" ); - return; - } - } - - /* If the element we are initialising has the same ID as a table which was previously - * initialised, but the table nodes don't match (from before) then we destroy the old - * instance by simply deleting it. This is under the assumption that the table has been - * destroyed by other methods. Anyone using non-id selectors will need to do this manually - */ - if ( DataTable.settings[i].sTableId == this.id ) - { - DataTable.settings.splice( i, 1 ); - break; - } - } - - /* Ensure the table has an ID - required for accessibility */ - if ( sId === null || sId === "" ) - { - sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++); - this.id = sId; - } - - /* Create the settings object for this table and set some of the default parameters */ - var oSettings = $.extend( true, {}, DataTable.models.oSettings, { - "nTable": this, - "oApi": _that.oApi, - "oInit": oInit, - "sDestroyWidth": $(this).width(), - "sInstance": sId, - "sTableId": sId - } ); - DataTable.settings.push( oSettings ); - - // Need to add the instance after the instance after the settings object has been added - // to the settings array, so we can self reference the table instance if more than one - oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable(); - - /* Setting up the initialisation object */ - if ( !oInit ) - { - oInit = {}; - } - - // Backwards compatibility, before we apply all the defaults - if ( oInit.oLanguage ) - { - _fnLanguageCompat( oInit.oLanguage ); - } - - oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit ); - - // Map the initialisation options onto the settings object - _fnMap( oSettings.oFeatures, oInit, "bPaginate" ); - _fnMap( oSettings.oFeatures, oInit, "bLengthChange" ); - _fnMap( oSettings.oFeatures, oInit, "bFilter" ); - _fnMap( oSettings.oFeatures, oInit, "bSort" ); - _fnMap( oSettings.oFeatures, oInit, "bInfo" ); - _fnMap( oSettings.oFeatures, oInit, "bProcessing" ); - _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" ); - _fnMap( oSettings.oFeatures, oInit, "bSortClasses" ); - _fnMap( oSettings.oFeatures, oInit, "bServerSide" ); - _fnMap( oSettings.oFeatures, oInit, "bDeferRender" ); - _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" ); - _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" ); - _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" ); - _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" ); - _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" ); - _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" ); - _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" ); - _fnMap( oSettings, oInit, "asStripeClasses" ); - _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy - _fnMap( oSettings, oInit, "fnServerData" ); - _fnMap( oSettings, oInit, "fnFormatNumber" ); - _fnMap( oSettings, oInit, "sServerMethod" ); - _fnMap( oSettings, oInit, "aaSorting" ); - _fnMap( oSettings, oInit, "aaSortingFixed" ); - _fnMap( oSettings, oInit, "aLengthMenu" ); - _fnMap( oSettings, oInit, "sPaginationType" ); - _fnMap( oSettings, oInit, "sAjaxSource" ); - _fnMap( oSettings, oInit, "sAjaxDataProp" ); - _fnMap( oSettings, oInit, "iCookieDuration" ); - _fnMap( oSettings, oInit, "sCookiePrefix" ); - _fnMap( oSettings, oInit, "sDom" ); - _fnMap( oSettings, oInit, "bSortCellsTop" ); - _fnMap( oSettings, oInit, "iTabIndex" ); - _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" ); - _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" ); - _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" ); - _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" ); - _fnMap( oSettings, oInit, "fnCookieCallback" ); - _fnMap( oSettings, oInit, "fnStateLoad" ); - _fnMap( oSettings, oInit, "fnStateSave" ); - _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" ); - - /* Callback functions which are array driven */ - _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' ); - _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' ); - _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' ); - _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' ); - _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' ); - _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' ); - - if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort && - oSettings.oFeatures.bSortClasses ) - { - /* Enable sort classes for server-side processing. Safe to do it here, since server-side - * processing must be enabled by the developer - */ - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' ); - } - else if ( oSettings.oFeatures.bDeferRender ) - { - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' ); - } - - if ( oInit.bJQueryUI ) - { - /* Use the JUI classes object for display. You could clone the oStdClasses object if - * you want to have multiple tables with multiple independent classes - */ - $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses ); - - if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" ) - { - /* Set the DOM to use a layout suitable for jQuery UI's theming */ - oSettings.sDom = '<"H"lfr>t<"F"ip>'; - } - } - else - { - $.extend( oSettings.oClasses, DataTable.ext.oStdClasses ); - } - $(this).addClass( oSettings.oClasses.sTable ); - - /* Calculate the scroll bar width and cache it for use later on */ - if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) - { - oSettings.oScroll.iBarWidth = _fnScrollBarWidth(); - } - - if ( oSettings.iInitDisplayStart === undefined ) - { - /* Display start point, taking into account the save saving */ - oSettings.iInitDisplayStart = oInit.iDisplayStart; - oSettings._iDisplayStart = oInit.iDisplayStart; - } - - /* Must be done after everything which can be overridden by a cookie! */ - if ( oInit.bStateSave ) - { - oSettings.oFeatures.bStateSave = true; - _fnLoadState( oSettings, oInit ); - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' ); - } - - if ( oInit.iDeferLoading !== null ) - { - oSettings.bDeferLoading = true; - var tmp = $.isArray( oInit.iDeferLoading ); - oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading; - oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading; - } - - if ( oInit.aaData !== null ) - { - bUsePassedData = true; - } - - /* Language definitions */ - if ( oInit.oLanguage.sUrl !== "" ) - { - /* Get the language definitions from a file - because this Ajax call makes the language - * get async to the remainder of this function we use bInitHandedOff to indicate that - * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor - */ - oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl; - $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) { - _fnLanguageCompat( json ); - $.extend( true, oSettings.oLanguage, oInit.oLanguage, json ); - _fnInitialise( oSettings ); - } ); - bInitHandedOff = true; - } - else - { - $.extend( true, oSettings.oLanguage, oInit.oLanguage ); - } - - - /* - * Stripes - */ - if ( oInit.asStripeClasses === null ) - { - oSettings.asStripeClasses =[ - oSettings.oClasses.sStripeOdd, - oSettings.oClasses.sStripeEven - ]; - } - - /* Remove row stripe classes if they are already on the table row */ - var bStripeRemove = false; - var anRows = $(this).children('tbody').children('tr'); - for ( i=0, iLen=oSettings.asStripeClasses.length ; i<iLen ; i++ ) - { - if ( anRows.filter(":lt(2)").hasClass( oSettings.asStripeClasses[i]) ) - { - bStripeRemove = true; - break; - } - } - - if ( bStripeRemove ) - { - /* Store the classes which we are about to remove so they can be readded on destroy */ - oSettings.asDestroyStripes = [ '', '' ]; - if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeOdd) ) - { - oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeOdd+" "; - } - if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeEven) ) - { - oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeEven; - } - if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeOdd) ) - { - oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeOdd+" "; - } - if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeEven) ) - { - oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeEven; - } - - anRows.removeClass( oSettings.asStripeClasses.join(' ') ); - } - - - /* - * Columns - * See if we should load columns automatically or use defined ones - */ - var anThs = []; - var aoColumnsInit; - var nThead = this.getElementsByTagName('thead'); - if ( nThead.length !== 0 ) - { - _fnDetectHeader( oSettings.aoHeader, nThead[0] ); - anThs = _fnGetUniqueThs( oSettings ); - } - - /* If not given a column array, generate one with nulls */ - if ( oInit.aoColumns === null ) - { - aoColumnsInit = []; - for ( i=0, iLen=anThs.length ; i<iLen ; i++ ) - { - aoColumnsInit.push( null ); - } - } - else - { - aoColumnsInit = oInit.aoColumns; - } - - /* Add the columns */ - for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ ) - { - /* Short cut - use the loop to check if we have column visibility state to restore */ - if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen ) - { - if ( aoColumnsInit[i] === null ) - { - aoColumnsInit[i] = {}; - } - aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible; - } - - _fnAddColumn( oSettings, anThs ? anThs[i] : null ); - } - - /* Apply the column definitions */ - _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) { - _fnColumnOptions( oSettings, iCol, oDef ); - } ); - - - /* - * Sorting - * Check the aaSorting array - */ - for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ ) - { - if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length ) - { - oSettings.aaSorting[i][0] = 0; - } - var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ]; - - /* Add a default sorting index */ - if ( oSettings.aaSorting[i][2] === undefined ) - { - oSettings.aaSorting[i][2] = 0; - } - - /* If aaSorting is not defined, then we use the first indicator in asSorting */ - if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined ) - { - oSettings.aaSorting[i][1] = oColumn.asSorting[0]; - } - - /* Set the current sorting index based on aoColumns.asSorting */ - for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ ) - { - if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] ) - { - oSettings.aaSorting[i][2] = j; - break; - } - } - } - - /* Do a first pass on the sorting classes (allows any size changes to be taken into - * account, and also will apply sorting disabled classes if disabled - */ - _fnSortingClasses( oSettings ); - - - /* - * Final init - * Cache the header, body and footer as required, creating them if needed - */ - - // Work around for Webkit bug 83867 - store the caption-side before removing from doc - var captions = $(this).children('caption').each( function () { - this._captionSide = $(this).css('caption-side'); - } ); - - var thead = $(this).children('thead'); - if ( thead.length === 0 ) - { - thead = [ document.createElement( 'thead' ) ]; - this.appendChild( thead[0] ); - } - oSettings.nTHead = thead[0]; - - var tbody = $(this).children('tbody'); - if ( tbody.length === 0 ) - { - tbody = [ document.createElement( 'tbody' ) ]; - this.appendChild( tbody[0] ); - } - oSettings.nTBody = tbody[0]; - oSettings.nTBody.setAttribute( "role", "alert" ); - oSettings.nTBody.setAttribute( "aria-live", "polite" ); - oSettings.nTBody.setAttribute( "aria-relevant", "all" ); - - var tfoot = $(this).children('tfoot'); - if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) - { - // If we are a scrolling table, and no footer has been given, then we need to create - // a tfoot element for the caption element to be appended to - tfoot = [ document.createElement( 'tfoot' ) ]; - this.appendChild( tfoot[0] ); - } - - if ( tfoot.length > 0 ) - { - oSettings.nTFoot = tfoot[0]; - _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); - } - - /* Check if there is data passing into the constructor */ - if ( bUsePassedData ) - { - for ( i=0 ; i<oInit.aaData.length ; i++ ) - { - _fnAddData( oSettings, oInit.aaData[ i ] ); - } - } - else - { - /* Grab the data from the page */ - _fnGatherData( oSettings ); - } - - /* Copy the data index array */ - oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); - - /* Initialisation complete - table can be drawn */ - oSettings.bInitialised = true; - - /* Check if we need to initialise the table (it might not have been handed off to the - * language processor) - */ - if ( bInitHandedOff === false ) - { - _fnInitialise( oSettings ); - } - } ); - }; - - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, in order - * to ensure compatibility. - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the - * formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the required - * version, or false if this version of DataTales is not suitable - * @static - * @dtopt API-Static - * - * @example - * alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) ); - */ - DataTable.fnVersionCheck = function( sVersion ) - { - /* This is cheap, but effective */ - var fnZPad = function (Zpad, count) - { - while(Zpad.length < count) { - Zpad += '0'; - } - return Zpad; - }; - var aThis = DataTable.ext.sVersion.split('.'); - var aThat = sVersion.split('.'); - var sThis = '', sThat = ''; - - for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) - { - sThis += fnZPad( aThis[i], 3 ); - sThat += fnZPad( aThat[i], 3 ); - } - - return parseInt(sThis, 10) >= parseInt(sThat, 10); - }; - - - /** - * Check if a TABLE node is a DataTable table already or not. - * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other - * node types can be passed in, but will always return false). - * @returns {boolean} true the table given is a DataTable, or false otherwise - * @static - * @dtopt API-Static - * - * @example - * var ex = document.getElementById('example'); - * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) { - * $(ex).dataTable(); - * } - */ - DataTable.fnIsDataTable = function ( nTable ) - { - var o = DataTable.settings; - - for ( var i=0 ; i<o.length ; i++ ) - { - if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable ) - { - return true; - } - } - - return false; - }; - - - /** - * Get all DataTable tables that have been initialised - optionally you can select to - * get only currently visible tables. - * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or - * visible tables only. - * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables - * @static - * @dtopt API-Static - * - * @example - * var table = $.fn.dataTable.fnTables(true); - * if ( table.length > 0 ) { - * $(table).dataTable().fnAdjustColumnSizing(); - * } - */ - DataTable.fnTables = function ( bVisible ) - { - var out = []; - - jQuery.each( DataTable.settings, function (i, o) { - if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) ) - { - out.push( o.nTable ); - } - } ); - - return out; - }; - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @member - * @type string - * @default Version number - */ - DataTable.version = "1.9.2"; - - /** - * Private data store, containing all of the settings objects that are created for the - * tables on a given page. - * - * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> - * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>. - * @member - * @type array - * @default [] - * @private - */ - DataTable.settings = []; - - /** - * Object models container, for the various models that DataTables has available - * to it. These models define the objects that are used to hold the active state - * and configuration of the table. - * @namespace - */ - DataTable.models = {}; - - - /** - * DataTables extension options and plug-ins. This namespace acts as a collection "area" - * for plug-ins that can be used to extend the default DataTables behaviour - indeed many - * of the build in methods use this method to provide their own capabilities (sorting methods - * for example). - * - * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed - * and modified by plug-ins. - * @namespace - */ - DataTable.models.ext = { - /** - * Plug-in filtering functions - this method of filtering is complimentary to the default - * type based filtering, and a lot more comprehensive as it allows you complete control - * over the filtering logic. Each element in this array is a function (parameters - * described below) that is called for every row in the table, and your logic decides if - * it should be included in the filtered data set or not. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{array|object} Data for the row to be processed (same as the original format - * that was passed in as the data source, or an array from a DOM data source</li> - * <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can - * be useful to retrieve the TR element if you need DOM interaction.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{boolean} Include the row in the filtered result set (true) or not (false)</li> - * </ul> - * </il> - * </ul> - * @type array - * @default [] - * - * @example - * // The following example shows custom filtering being applied to the fourth column (i.e. - * // the aData[3] index) based on two input values from the end-user, matching the data in - * // a certain range. - * $.fn.dataTableExt.afnFiltering.push( - * function( oSettings, aData, iDataIndex ) { - * var iMin = document.getElementById('min').value * 1; - * var iMax = document.getElementById('max').value * 1; - * var iVersion = aData[3] == "-" ? 0 : aData[3]*1; - * if ( iMin == "" && iMax == "" ) { - * return true; - * } - * else if ( iMin == "" && iVersion < iMax ) { - * return true; - * } - * else if ( iMin < iVersion && "" == iMax ) { - * return true; - * } - * else if ( iMin < iVersion && iVersion < iMax ) { - * return true; - * } - * return false; - * } - * ); - */ - "afnFiltering": [], - - - /** - * Plug-in sorting functions - this method of sorting is complimentary to the default type - * based sorting that DataTables does automatically, allowing much greater control over the - * the data that is being used to sort a column. This is useful if you want to do sorting - * based on live data (for example the contents of an 'input' element) rather than just the - * static string that DataTables knows of. The way these plug-ins work is that you create - * an array of the values you wish to be sorted for the column in question and then return - * that array. Which pre-sorting function is run here depends on the sSortDataType parameter - * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort - * data. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{int} Target column index</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{array} Data for the column to be sorted upon</li> - * </ul> - * </il> - * </ul> - * - * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for - * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type array - * @default [] - * @deprecated - * - * @example - * // Updating the cached sorting information with user entered values in HTML input elements - * jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn ) - * { - * var aData = []; - * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () { - * aData.push( this.value ); - * } ); - * return aData; - * } - */ - "afnSortData": [], - - - /** - * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are accessible through the sDom initialisation - * option. As such, each feature plug-in must describe a function that is used to initialise - * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name - * of the feature (sFeature). Thus the objects attached to this method must provide: - * <ul> - * <li>{function} fnInit Initialisation of the plug-in - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{node|null} The element which contains your feature. Note that the return - * may also be void if your plug-in does not require to inject any DOM elements - * into DataTables control (sDom) - for example this might be useful when - * developing a plug-in which allows table control via keyboard entry.</li> - * </ul> - * </il> - * </ul> - * </li> - * <li>{character} cFeature Character that will be matched in sDom - case sensitive</li> - * <li>{string} sFeature Feature name</li> - * </ul> - * @type array - * @default [] - * - * @example - * // How TableTools initialises itself. - * $.fn.dataTableExt.aoFeatures.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T", - * "sFeature": "TableTools" - * } ); - */ - "aoFeatures": [], - - - /** - * Type detection plug-in functions - DataTables utilises types to define how sorting and - * filtering behave, and types can be either be defined by the developer (sType for the - * column) or they can be automatically detected by the methods in this array. The functions - * defined in the array are quite simple, taking a single parameter (the data to analyse) - * and returning the type if it is a known type, or null otherwise. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data from the column cell to be analysed</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{string|null} Data type detected, or null if unknown (and thus pass it - * on to the other type detection functions.</li> - * </ul> - * </il> - * </ul> - * @type array - * @default [] - * - * @example - * // Currency type detection plug-in: - * jQuery.fn.dataTableExt.aTypes.push( - * function ( sData ) { - * var sValidChars = "0123456789.-"; - * var Char; - * - * // Check the numeric part - * for ( i=1 ; i<sData.length ; i++ ) { - * Char = sData.charAt(i); - * if (sValidChars.indexOf(Char) == -1) { - * return null; - * } - * } - * - * // Check prefixed by currency - * if ( sData.charAt(0) == '$' || sData.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - "aTypes": [], - - - /** - * Provide a common method for plug-ins to check the version of DataTables being used, - * in order to ensure compatibility. - * @type function - * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note - * that the formats "X" and "X.Y" are also acceptable. - * @returns {boolean} true if this version of DataTables is greater or equal to the - * required version, or false if this version of DataTales is not suitable - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable(); - * alert( oTable.fnVersionCheck( '1.9.0' ) ); - * } ); - */ - "fnVersionCheck": DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @default 0 - */ - "iApiIndex": 0, - - - /** - * Pre-processing of filtering data plug-ins - When you assign the sType for a column - * (or have it automatically detected for you by DataTables or a type detection plug-in), - * you will typically be using this for custom sorting, but it can also be used to provide - * custom filtering by allowing you to pre-processing the data and returning the data in - * the format that should be filtered upon. This is done by adding functions this object - * with a parameter name which matches the sType for that target column. This is the - * corollary of <i>afnSortData</i> for filtering data. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data from the column cell to be prepared for filtering</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{string|null} Formatted string that will be used for the filtering.</li> - * </ul> - * </il> - * </ul> - * - * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for - * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type object - * @default {} - * @deprecated - * - * @example - * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) { - * return sData.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - "ofnSearch": {}, - - - /** - * Container for all private functions in DataTables so they can be exposed externally - * @type object - * @default {} - */ - "oApi": {}, - - - /** - * Storage for the various classes that DataTables uses - * @type object - * @default {} - */ - "oStdClasses": {}, - - - /** - * Storage for the various classes that DataTables uses - jQuery UI suitable - * @type object - * @default {} - */ - "oJUIClasses": {}, - - - /** - * Pagination plug-in methods - The style and controls of the pagination can significantly - * impact on how the end user interacts with the data in your table, and DataTables allows - * the addition of pagination controls by extending this object, which can then be enabled - * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that - * is added is an object (the property name of which is what <i>sPaginationType</i> refers - * to) that has two properties, both methods that are used by DataTables to update the - * control's state. - * <ul> - * <li> - * fnInit - Initialisation of the paging controls. Called only during initialisation - * of the table. It is expected that this function will add the required DOM elements - * to the page for the paging controls to work. The element pointer - * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging - * controls (note that this is a 2D array to allow for multiple instances of each - * DataTables DOM element). It is suggested that you add the controls to this element - * as children - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{node} Container into which the pagination controls must be inserted</li> - * <li>{function} Draw callback function - whenever the controls cause a page - * change, this method must be called to redraw the table.</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>No return required</li> - * </ul> - * </il> - * </ul> - * </il> - * <li> - * fnInit - This function is called whenever the paging status of the table changes and is - * typically used to update classes and/or text of the paging controls to reflex the new - * status. - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li> - * <li>{function} Draw callback function - in case you need to redraw the table again - * or attach new event listeners</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>No return required</li> - * </ul> - * </il> - * </ul> - * </il> - * </ul> - * @type object - * @default {} - * - * @example - * $.fn.dataTableExt.oPagination.four_button = { - * "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { - * nFirst = document.createElement( 'span' ); - * nPrevious = document.createElement( 'span' ); - * nNext = document.createElement( 'span' ); - * nLast = document.createElement( 'span' ); - * - * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) ); - * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) ); - * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) ); - * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) ); - * - * nFirst.className = "paginate_button first"; - * nPrevious.className = "paginate_button previous"; - * nNext.className="paginate_button next"; - * nLast.className = "paginate_button last"; - * - * nPaging.appendChild( nFirst ); - * nPaging.appendChild( nPrevious ); - * nPaging.appendChild( nNext ); - * nPaging.appendChild( nLast ); - * - * $(nFirst).click( function () { - * oSettings.oApi._fnPageChange( oSettings, "first" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nPrevious).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "previous" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nNext).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "next" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nLast).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "last" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nFirst).bind( 'selectstart', function () { return false; } ); - * $(nPrevious).bind( 'selectstart', function () { return false; } ); - * $(nNext).bind( 'selectstart', function () { return false; } ); - * $(nLast).bind( 'selectstart', function () { return false; } ); - * }, - * - * "fnUpdate": function ( oSettings, fnCallbackDraw ) { - * if ( !oSettings.aanFeatures.p ) { - * return; - * } - * - * // Loop over each instance of the pager - * var an = oSettings.aanFeatures.p; - * for ( var i=0, iLen=an.length ; i<iLen ; i++ ) { - * var buttons = an[i].getElementsByTagName('span'); - * if ( oSettings._iDisplayStart === 0 ) { - * buttons[0].className = "paginate_disabled_previous"; - * buttons[1].className = "paginate_disabled_previous"; - * } - * else { - * buttons[0].className = "paginate_enabled_previous"; - * buttons[1].className = "paginate_enabled_previous"; - * } - * - * if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) { - * buttons[2].className = "paginate_disabled_next"; - * buttons[3].className = "paginate_disabled_next"; - * } - * else { - * buttons[2].className = "paginate_enabled_next"; - * buttons[3].className = "paginate_enabled_next"; - * } - * } - * } - * }; - */ - "oPagination": {}, - - - /** - * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the - * data column (you can add your own type detection functions, or override automatic - * detection using sType). With this specific type given to the column, DataTables will - * apply the required sort from the functions in the object. Each sort type must provide - * two mandatory methods, one each for ascending and descending sorting, and can optionally - * provide a pre-formatting method that will help speed up sorting by allowing DataTables - * to pre-format the sort data only once (rather than every time the actual sort functions - * are run). The two sorting functions are typical Javascript sort methods: - * <ul> - * <li> - * Function input parameters: - * <ul> - * <li>{*} Data to compare to the second parameter</li> - * <li>{*} Data to compare to the first parameter</li> - * </ul> - * </li> - * <li> - * Function return: - * <ul> - * <li>{int} Sorting match: <0 if first parameter should be sorted lower than - * the second parameter, ===0 if the two parameters are equal and >0 if - * the first parameter should be sorted height than the second parameter.</li> - * </ul> - * </il> - * </ul> - * @type object - * @default {} - * - * @example - * // Case-sensitive string sorting, with no pre-formatting method - * $.extend( $.fn.dataTableExt.oSort, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - * - * @example - * // Case-insensitive string sorting, with pre-formatting - * $.extend( $.fn.dataTableExt.oSort, { - * "string-pre": function(x) { - * return x.toLowerCase(); - * }, - * "string-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - "oSort": {}, - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @type string - * @default Version number - */ - "sVersion": DataTable.version, - - - /** - * How should DataTables report an error. Can take the value 'alert' or 'throw' - * @type string - * @default alert - */ - "sErrMode": "alert", - - - /** - * Store information for DataTables to access globally about other instances - * @namespace - * @private - */ - "_oExternConfig": { - /* int:iNextUnique - next unique number for an instance */ - "iNextUnique": 0 - } - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * search information for the global filter and individual column filters. - * @namespace - */ - DataTable.models.oSearch = { - /** - * Flag to indicate if the filtering should be case insensitive or not - * @type boolean - * @default true - */ - "bCaseInsensitive": true, - - /** - * Applied search term - * @type string - * @default <i>Empty string</i> - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mDataProp options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default [] - * @private - */ - "_aSortData": [], - - /** - * Array of TD elements that are cached for hidden rows, so they can be - * reinserted into the table if a column is made visible again (or to act - * as a store if a column is made hidden). Only hidden columns have a - * reference in the array. For non-hidden columns the value is either - * undefined or null. - * @type array nodes - * @default [] - * @private - */ - "_anHidden": [], - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default <i>Empty string</i> - * @private - */ - "_sRowStripe": "" - }; - - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.columns} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * When using fnRender, you have two options for what to do with the data, - * and this property serves as the switch. Firstly, you can have the sorting - * and filtering use the rendered value (true - default), or you can have - * the sorting and filtering us the original value (false). - * - * *NOTE* It is it is advisable now to use mDataProp as a function and make - * use of the 'type' that it gives, allowing (potentially) different data to - * be used for sorting, filtering, display and type detection. - * @type boolean - * @deprecated - */ - "bUseRendered": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Flag to indicate to the type detection method if the automatic type - * detection should be used, or if a column type (sType) has been specified - * @type boolean - * @default true - * @private - */ - "_bAutoType": true, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to fnRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available (since it is not when fnRender is called). - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should <b>never</b> - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mDataProp to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Custom display function that will be called for the display of each cell - * in this column. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @returns {string} The string you which to use in the display - * @default null - */ - "fnRender": null, - - /** - * Function to set data for a cell in the column. You should <b>never</b> - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mDataProp to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mDataProp": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mDataProp - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * @dtopt Option - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "aoColumns": [ - * { "sTitle": "Engine" }, - * { "sTitle": "Browser" }, - * { "sTitle": "Platform" }, - * { "sTitle": "Version" }, - * { "sTitle": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (mDataProp) - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "aoColumns": [ - * { "sTitle": "Engine", "mDataProp": "engine" }, - * { "sTitle": "Browser", "mDataProp": "browser" }, - * { "sTitle": "Platform", "mDataProp": "platform" }, - * { "sTitle": "Version", "mDataProp": "version" }, - * { "sTitle": "Grade", "mDataProp": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If sorting is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed upon, - * and the sorting direction, with this variable. The aaSorting array should - * contain an array for each column to be sorted initially containing the - * column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * @dtopt Option - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [] - * } ); - * } ); - */ - "aaSorting": [[0,'asc']], - - - /** - * This parameter is basically identical to the aaSorting parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting will - * always be forced on first - any sorting after that (from the user) will - * then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSortingFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * @type array - * @default [ 10, 25, 50, 100 ] - * @dtopt Option - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - * - * @example - * // Setting the default display length as well as length menu - * // This is likely to be wanted if you remove the '10' option which - * // is the iDisplayLength default. - * $(document).ready(function() { - * $('#example').dataTable( { - * "iDisplayLength": 25, - * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [ 10, 25, 50, 100 ], - - - /** - * The aoColumns option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.columns}. Note that if you use aoColumns to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - */ - "aoColumns": null, - - /** - * Very similar to aoColumns, aoColumnDefs allows you to target a specific - * column, multiple columns, or all columns, using the aTargets property of - * each object in the array. This allows great flexibility when creating - * tables, as the aoColumnDefs arrays can be of any length, targeting the - * columns you specifically want. aoColumnDefs may use any of the column - * options available: {@link DataTable.defaults.columns}, but it _must_ - * have aTargets defined in each object in the array. Values in the aTargets - * array may be: - * <ul> - * <li>a string - class name will be matched on the TH for the column</li> - * <li>0 or a positive integer - column index counting from the left</li> - * <li>a negative integer - column index counting from the right</li> - * <li>the string "_all" - all columns (i.e. assign a default)</li> - * </ul> - * @member - */ - "aoColumnDefs": null, - - - /** - * Basically the same as oSearch, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoSearchCols": [ - * null, - * { "sSearch": "My filter" }, - * null, - * { "sSearch": "^[0-9]", "bEscapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null <i>Will take the values determinted by the oClasses.sStripe* - * options</i> - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using aoColumns. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bAutoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/arrays.txt", - * "bDeferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "bFilter": false, - * "bDestroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.sDom}. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bFilter": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bInfo": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some - * slightly different and additional mark-up from what DataTables has - * traditionally used). - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bJQueryUI": true - * } ); - * } ); - */ - "bJQueryUI": false, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate). - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bLengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bPaginate": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bProcessing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). bDestroy can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false, - * "bRetrieve": true - * } ); - * } - * - * function tableActions () - * { - * var oTable = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * @type boolean - * @default true - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollAutoCss": false, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollAutoCss": true, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200", - * "bScrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Enable infinite scrolling for DataTables (to be used in combination with - * sScrollY). Infinite scrolling means that DataTables will continually load - * data as a user scrolls through a table, which is very useful for large - * dataset. This cannot be used with pagination, which is automatically - * disabled. Note - the Scroller extra for DataTables is recommended in - * in preference to this option. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollInfinite": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * sAjaxSource parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * @dtopt Features - * @dtopt Server-side - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the "bSortable" option for each column. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSort": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bSortCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and - * 'sorting_3' to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSortClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled a cookie will be used to save - * table display information such as pagination information, display length, - * filtering and sorting. As such when the end user reloads the page the - * display display will match what thy had previously set up. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bStateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * Customise the cookie and / or the parameters being stored when using - * DataTables with state saving enabled. This function is called whenever - * the cookie is modified, and it expects a fully formed cookie string to be - * returned. Note that the data object passed in is a Javascript object which - * must be converted to a string (JSON.stringify for example). - * @type function - * @param {string} sName Name of the cookie defined by DataTables - * @param {object} oData Data to be stored in the cookie - * @param {string} sExpires Cookie expires string - * @param {string} sPath Path of the cookie to set - * @returns {string} Cookie formatted string (which should be encoded by - * using encodeURIComponent()) - * @dtopt Callbacks - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "fnCookieCallback": function (sName, oData, sExpires, sPath) { - * // Customise oData or sName or whatever else here - * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath; - * } - * } ); - * } ); - */ - "fnCookieCallback": null, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} nRow "TR" element for the current row - * @param {array} aData Raw data array for this row - * @param {int} iDataIndex The index of this row in aoData - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnCreatedRow": function( nRow, aData, iDataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( aData[4] == "A" ) - * { - * $('td:eq(4)', nRow).html( '<b>A</b>' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnDrawCallback": function( oSettings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' even. - * @type function - * @param {node} nFoot "TR" element for the footer - * @param {array} aData Full table data (as derived from the original HTML) - * @param {int} iStart Index for the current display starting point in the - * display array - * @param {int} iEnd Index for the current display ending point in the - * display array - * @param {array int} aiDisplay Index array to translate the visual position - * to the full data array - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) { - * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} iIn number to be formatted - * @returns {string} formatted string for DataTables to show the number - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnFormatNumber": function ( iIn ) { - * if ( iIn < 1000 ) { - * return iIn; - * } else { - * var - * s=(iIn+""), - * a=s.split(""), out="", - * iLen=s.length; - * - * for ( var i=0 ; i<iLen ; i++ ) { - * if ( i%3 === 0 && i !== 0 ) { - * out = "'"+out; - * } - * out = a[iLen-i-1]+out; - * } - * } - * return out; - * }; - * } ); - * } ); - */ - "fnFormatNumber": function ( iIn ) { - if ( iIn < 1000 ) - { - // A small optimisation for what is likely to be the majority of use cases - return iIn; - } - - var s=(iIn+""), a=s.split(""), out="", iLen=s.length; - - for ( var i=0 ; i<iLen ; i++ ) - { - if ( i%3 === 0 && i !== 0 ) - { - out = this.oLanguage.sInfoThousands+out; - } - out = a[iLen-i-1]+out; - } - return out; - }, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify the header row. This can be used to calculate and - * display useful information about the table. - * @type function - * @param {node} nHead "TR" element for the header - * @param {array} aData Full table data (as derived from the original HTML) - * @param {int} iStart Index for the current display starting point in the - * display array - * @param {int} iEnd Index for the current display ending point in the - * display array - * @param {array int} aiDisplay Index array to translate the visual position - * to the full data array - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) { - * nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records"; - * } - * } ); - * } ) - */ - "fnHeaderCallback": null, - - - /** - * The information element can be used to convey information about the current - * state of the table. Although the internationalisation options presented by - * DataTables are quite capable of dealing with most customisations, there may - * be times where you wish to customise the string further. This callback - * allows you to do exactly that. - * @type function - * @param {object} oSettings DataTables settings object - * @param {int} iStart Starting position in data for the draw - * @param {int} iEnd End position in data for the draw - * @param {int} iMax Total number of rows in the table (regardless of - * filtering) - * @param {int} iTotal Total number of rows in the data set, after filtering - * @param {string} sPre The string that DataTables has formatted using it's - * own rules - * @returns {string} The string to be displayed in the information element. - * @dtopt Callbacks - * - * @example - * $('#example').dataTable( { - * "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) { - * return iStart +" to "+ iEnd; - * } - * } ); - */ - "fnInfoCallback": null, - - - /** - * Called when the table has been initialised. Normally DataTables will - * initialise sequentially and there will be no need for this function, - * however, this does not hold true when using external language information - * since that is obtained using an async XHR call. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnInitComplete": function(oSettings, json) { - * alert( 'DataTables has finished its initialisation.' ); - * } - * } ); - * } ) - */ - "fnInitComplete": null, - - - /** - * Called at the very start of each table draw and can be used to cancel the - * draw by returning false, any other return (including undefined) results in - * the full draw occurring). - * @type function - * @param {object} oSettings DataTables settings object - * @returns {boolean} False will cancel the draw, anything else (including no - * return) will allow it to complete. - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnPreDrawCallback": function( oSettings ) { - * if ( $('#test').val() == 1 ) { - * return false; - * } - * } - * } ); - * } ); - */ - "fnPreDrawCallback": null, - - - /** - * This function allows you to 'post process' each row after it have been - * generated for each table draw, but before it is rendered on screen. This - * function might be used for setting the row class name etc. - * @type function - * @param {node} nRow "TR" element for the current row - * @param {array} aData Raw data array for this row - * @param {int} iDisplayIndex The display index for the current table draw - * @param {int} iDisplayIndexFull The index of the data in the full list of - * rows (after filtering) - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { - * // Bold the grade for all 'A' grade browsers - * if ( aData[4] == "A" ) - * { - * $('td:eq(4)', nRow).html( '<b>A</b>' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * This parameter allows you to override the default function which obtains - * the data from the server ($.getJSON) so something more suitable for your - * application. For example you could use POST data, or pull information from - * a Gears or AIR database. - * @type function - * @member - * @param {string} sSource HTTP source to obtain the data from (sAjaxSource) - * @param {array} aoData A key/value pair object containing the data to send - * to the server - * @param {function} fnCallback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * // POST data to server - * $(document).ready(function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "xhr.php", - * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) { - * oSettings.jqXHR = $.ajax( { - * "dataType": 'json', - * "type": "POST", - * "url": sSource, - * "data": aoData, - * "success": fnCallback - * } ); - * } - * } ); - * } ); - */ - "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) { - oSettings.jqXHR = $.ajax( { - "url": sUrl, - "data": aoData, - "success": function (json) { - $(oSettings.oInstance).trigger('xhr', oSettings); - fnCallback( json ); - }, - "dataType": "json", - "cache": false, - "type": oSettings.sServerMethod, - "error": function (xhr, error, thrown) { - if ( error == "parsererror" ) { - oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+ - "server could not be parsed. This is caused by a JSON formatting error." ); - } - } - } ); - }, - - - /** - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} aoData Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the aoData array passed in, - * as this is passed by reference. - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "fnServerParams": function ( aoData ) { - * aoData.push( { "name": "more_data", "value": "my_value" } ); - * } - * } ); - * } ); - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from its state saving - * cookie, but you might wish to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @return {object} The DataTables state object to be loaded - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoad": function (oSettings) { - * var o; - * - * // Send an Ajax request to the server to get the data. Note that - * // this is a synchronous request. - * $.ajax( { - * "url": "/state_load", - * "async": false, - * "dataType": "json", - * "success": function (json) { - * o = json; - * } - * } ); - * - * return o; - * } - * } ); - * } ); - */ - "fnStateLoad": function ( oSettings ) { - var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance ); - var oData; - - try { - oData = (typeof $.parseJSON === 'function') ? - $.parseJSON(sData) : eval( '('+sData+')' ); - } catch (e) { - oData = null; - } - - return oData; - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the 'stateLoadParams' event to load parameters for - * a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that is to be loaded - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * return false; - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that was loaded - * @dtopt Callbacks - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoaded": function (oSettings, oData) { - * alert( 'Saved filter was: '+oData.oSearch.sSearch ); - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored - by default it will use a cookie, but you - * might want to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSave": function (oSettings, oData) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": oData, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSave": function ( oSettings, oData ) { - this.oApi._fnCreateCookie( - oSettings.sCookiePrefix+oSettings.sInstance, - this.oApi._fnJsonString(oData), - oSettings.iCookieDuration, - oSettings.sCookiePrefix, - oSettings.fnCookieCallback - ); - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the 'stateSaveParams' event to save parameters for a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready(function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSaveParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration of the cookie which is used for storing session information. This - * value is given in seconds. - * @type int - * @default 7200 <i>(2 hours)</i> - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iCookieDuration": 60*60*24 // 1 day - * } ); - * } ) - */ - "iCookieDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. iDeferLoading - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * @dtopt Options - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": [ 57, 100 ], - * "oSearch": { - * "sSearch": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (bLengthChange) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * The scroll gap is the amount of scrolling that is left to go before - * DataTables will load the next 'page' of data automatically. You typically - * want a gap which is big enough that the scrolling will be smooth for the - * user, while not so large that it will load more data than need. - * @type int - * @default 100 - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px", - * "iScrollLoadGap": 50 - * } ); - * } ); - */ - "iScrollLoadGap": 100, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a tabindex attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "iTabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the two built-in pagination - * control types ("two_button" and "full_numbers") - * @namespace - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sFirst": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sLast": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the next page. - * @type string - * @default Next - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sNext": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the previous page. - * @type string - * @default Previous - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sPrevious": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to sZeroRecords when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of sZeroRecords will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sEmptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information that - * is current on display on the page. The _START_, _END_ and _TOTAL_ - * variables are all dynamically replaced as the table display updates, and - * can be freely moved or removed as the language requirements change. - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match sInfo. - * @type string - * @default Showing 0 to 0 of 0 entries - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (sInfo) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are - * being used) at all times. - * @type string - * @default <i>Empty string</i> - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * DataTables has a build in number formatter (fnFormatNumber) which is used - * to format large numbers that are used in the table information. By - * default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoThousands": "'" - * } - * } ); - * } ); - */ - "sInfoThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * @dtopt Language - * - * @example - * // Language change only - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": 'Display <select>'+ - * '<option value="10">10</option>'+ - * '<option value="20">20</option>'+ - * '<option value="30">30</option>'+ - * '<option value="40">40</option>'+ - * '<option value="50">50</option>'+ - * '<option value="-1">All</option>'+ - * '</select> records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLoadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sProcessing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * @dtopt Language - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default <i>Empty string - i.e. disabled</i> - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. sEmptyTable is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * @dtopt Language - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sZeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the "sSearch" parameter must be - * defined, but all other parameters are optional. When "bRegex" is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When "bSmart" - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oSearch": {"sSearch": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * By default DataTables will look for the property 'aaData' when obtaining - * data from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted object - * notation to get a data source for multiple levels of nesting. - * @type string - * @default aaData - * @dtopt Options - * @dtopt Server-side - * - * @example - * // Get data from { "data": [...] } - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data" - * } ); - * } ); - * - * @example - * // Get data from { "data": { "inner": [...] } } - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data.inner" - * } ); - * } ); - */ - "sAjaxDataProp": "aaData", - - - /** - * You can instruct DataTables to load data from an external source using this - * parameter (use aData if you want to pass data in you already have). Simply - * provide a url a JSON object can be obtained from. This object must include - * the parameter 'aaData' which is the data source for the table. - * @type string - * @default null - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php" - * } ); - * } ) - */ - "sAjaxSource": null, - - - /** - * This parameter can be used to override the default prefix that DataTables - * assigns to a cookie when state saving is enabled. - * @type string - * @default SpryMedia_DataTables_ - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sCookiePrefix": "my_datatable_", - * } ); - * } ); - */ - "sCookiePrefix": "SpryMedia_DataTables_", - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - * <ul> - * <li>The following options are allowed: - * <ul> - * <li>'l' - Length changing</li - * <li>'f' - Filtering input</li> - * <li>'t' - The table!</li> - * <li>'i' - Information</li> - * <li>'p' - Pagination</li> - * <li>'r' - pRocessing</li> - * </ul> - * </li> - * <li>The following constants are allowed: - * <ul> - * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li> - * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li> - * </ul> - * </li> - * <li>The following syntax is expected: - * <ul> - * <li>'<' and '>' - div elements</li> - * <li>'<"class" and '>' - div with a class</li> - * <li>'<"#id" and '>' - div with an ID</li> - * </ul> - * </li> - * <li>Examples: - * <ul> - * <li>'<"wrapper"flipt>'</li> - * <li>'<lf<t>ip>'</li> - * </ul> - * </li> - * </ul> - * @type string - * @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> - * <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i> - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sDom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * DataTables features two different built-in pagination interaction methods - * ('two_button' or 'full_numbers') which present different page controls to - * the end user. Further methods can be added using the API (see below). - * @type string - * @default two_button - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sPaginationType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "two_button", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a certain - * layout, or you have a large number of columns in the table, you can enable - * x-scrolling to show the table in a viewport, which can be scrolled. This - * property can be any CSS unit, or a number (in which case it will be treated - * as a pixel measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "bScrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Options - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "sScrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default <i>blank string - i.e. disabled</i> - * @dtopt Features - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/post.php", - * "sServerMethod": "POST" - * } ); - * } ); - */ - "sServerMethod": "GET" - }; - - - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.columns = { - /** - * Allows a column's sorting to take multiple columns into account when - * doing a sort. For example first name / last name columns make sense to - * do a multi-column sort over the two columns. - * @type array - * @default null <i>Takes the value of the column index automatically</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] }, - * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] }, - * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "aDataSort": [ 0, 1 ] }, - * { "aDataSort": [ 1, 0 ] }, - * { "aDataSort": [ 2, 3, 4 ] }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - - - /** - * You can control the default sorting direction, and even alter the behaviour - * of the sort handler (i.e. only allow ascending sorting etc) using this - * parameter. - * @type array - * @default [ 'asc', 'desc' ] - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "asSorting": [ "asc" ], "aTargets": [ 1 ] }, - * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] }, - * { "asSorting": [ "desc" ], "aTargets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * { "asSorting": [ "asc" ] }, - * { "asSorting": [ "desc", "asc", "asc" ] }, - * { "asSorting": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSearchable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSearchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable sorting on this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSortable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSortable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * When using fnRender() for a column, you may wish to use the original data - * (before rendering) for sorting and filtering (the default is to used the - * rendered data that the user can see). This may be useful for dates etc. - * - * *NOTE* It is it is advisable now to use mDataProp as a function and make - * use of the 'type' that it gives, allowing (potentially) different data to - * be used for sorting, filtering, display and type detection. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "fnRender": function ( oObj ) { - * return oObj.aData[0] +' '+ oObj.aData[3]; - * }, - * "bUseRendered": false, - * "aTargets": [ 0 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { - * "fnRender": function ( oObj ) { - * return oObj.aData[0] +' '+ oObj.aData[3]; - * }, - * "bUseRendered": false - * }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "bUseRendered": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bVisible": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bVisible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to fnRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available (since it is not when fnRender is called). - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @param {int} iCol The column index for aoColumns - * @dtopt Columns - * - * @example - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ { - * "aTargets": [3], - * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { - * if ( sData == "1.7" ) { - * $(nTd).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * Custom display function that will be called for the display of each cell in - * this column. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @param {object} o.mDataProp The data property used for this column - * @param {*} val The current cell value - * @returns {string} The string you which to use in the display - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "fnRender": function ( o, val ) { - * return o.aData[0] +' '+ o.aData[3]; - * }, - * "aTargets": [ 0 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "fnRender": function ( o, val ) { - * return o.aData[0] +' '+ o.aData[3]; - * } }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "fnRender": null, - - - /** - * The column index (starting from 0!) that you wish a sort to be performed - * upon when this column is selected for sorting. This can be used for sorting - * on hidden columns for example. - * @type int - * @default -1 <i>Use automatically calculated column index</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "iDataSort": 1, "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "iDataSort": 1 }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "iDataSort": -1, - - - /** - * This property can be used to read data from any JSON data source property, - * including deeply nested objects / properties. mDataProp can be given in a - * number of different ways which effect its behaviour: - * <ul> - * <li>integer - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column).</li> - * <li>string - read an object property from the data source. Note that you can - * use Javascript dotted notation to read deep properties/arrays from the - * data source.</li> - * <li>null - the sDefaultContent option will be used for the cell (null - * by default, so you will need to specify the default content you want - - * typically an empty string). This can be useful on generated columns such - * as edit / delete action columns.</li> - * <li>function - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * <ul> - * <li>{array|object} The data source for the row</li> - * <li>{string} The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined when - * gathering data. Note that when <i>undefined</i> is given for the type - * DataTables expects to get the raw data for the object back</li> - * <li>{*} Data to set when the second parameter is 'set'.</li> - * </ul> - * The return value from the function is not required when 'set' is the type - * of call, but otherwise the return is what will be used for the data - * requested.</li> - * </ul> - * @type string|int|function|null - * @default null <i>Use automatically calculated column index</i> - * @dtopt Columns - * - * @example - * // Read table data from objects - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/deep.txt", - * "aoColumns": [ - * { "mDataProp": "engine" }, - * { "mDataProp": "browser" }, - * { "mDataProp": "platform.inner" }, - * { "mDataProp": "platform.details.0" }, - * { "mDataProp": "platform.details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using mDataProp as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "aTargets": [ 0 ], - * "mDataProp": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * ] - * } ); - * } ); - */ - "mDataProp": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready(function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "aTargets": [ 0 ], - * "sCellType": "th" - * ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default <i>Empty string</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sClass": "my_class", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sClass": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this, and it is not documented on the - * general DataTables.net documentation - * @type string - * @default <i>Empty string<i> - * @dtopt Columns - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "sContentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mDataProp - * is set to null, or because the data source itself is null). - * @type string - * @default null - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "mDataProp": null, - * "sDefaultContent": "Edit", - * "aTargets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "mDataProp": null, - * "sDefaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default <i>Empty string</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sName": "engine", "aTargets": [ 0 ] }, - * { "sName": "browser", "aTargets": [ 1 ] }, - * { "sName": "platform", "aTargets": [ 2 ] }, - * { "sName": "version", "aTargets": [ 3 ] }, - * { "sName": "grade", "aTargets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sName": "engine" }, - * { "sName": "browser" }, - * { "sName": "platform" }, - * { "sName": "version" }, - * { "sName": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the sorting which can be used to read - * realtime information from the table (updating the internally cached - * version) prior to sorting. This allows sorting to occur on user editable - * elements such as form inputs. - * @type string - * @default std - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] }, - * { "sType": "numeric", "aTargets": [ 3 ] }, - * { "sSortDataType": "dom-select", "aTargets": [ 4 ] }, - * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * { "sSortDataType": "dom-text" }, - * { "sSortDataType": "dom-text", "sType": "numeric" }, - * { "sSortDataType": "dom-select" }, - * { "sSortDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null <i>Derived from the 'TH' value for this column in the - * original HTML table.</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sTitle": "My column title", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sTitle": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be sorted. - * Four types (string, numeric, date and html (which will strip HTML tags - * before sorting)) are currently available. Note that only date formats - * understood by Javascript's Date() object will be accepted as type date. For - * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric', - * 'date' or 'html' (by default). Further types can be adding through - * plug-ins. - * @type string - * @default null <i>Auto-detected from raw data</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sType": "html", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sType": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applys 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null <i>Automatic</i> - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sWidth": "20%", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready(function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sWidth": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoCss": null, - - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Infinite scrolling enablement flag. Now deprecated in favour of - * using the Scroller plug-in. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfinite": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Space (in pixels) between the bottom of the scrolling container and - * the bottom of the scrolling viewport before the next page is loaded - * when using infinite scrolling. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - */ - "iLoadGap": null, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default - */ - "fnInfoCallback": null - }, - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - * <ul> - * <li>'l' - Length changing</li> - * <li>'f' - Filtering input</li> - * <li>'t' - The table!</li> - * <li>'i' - Information</li> - * <li>'p' - Pagination</li> - * <li>'r' - pRocessing</li> - * </ul> - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Search data array for regular expression searching - * @type array - * @default [] - */ - "asDataSearch": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - * <ul> - * <li>Index 0 - column number</li> - * <li>Index 1 - current sorting direction</li> - * <li>Index 2 - index of asSorting for this column</li> - * </ul> - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array|null - * @default null - */ - "aaSortingFixed": null, - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default <i>Empty string</i> - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The cookie duration (for bStateSave) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iCookieDuration": 0, - - /** - * The cookie name prefix. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default <i>Empty string</i> - */ - "sCookiePrefix": "", - - /** - * Callback function for cookie creation. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - * @default null - */ - "fnCookieCallback": null, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - * <ul> - * <li>function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')</li> - * <li>string:sName - name of callback</li> - * </ul> - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - * <ul> - * <li>function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading</li> - * <li>string:sName - name of callback</li> - * </ul> - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was loaded from the cookie. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Paging end point - aiDisplay index. Use fnDisplayEnd rather than - * this property to get the end point - * @type int - * @default 10 - * @private - */ - "_iDisplayEnd": 10, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * Flag to indicate if jQuery UI marking and classes should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bJUI": null, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsTotal, 10); - } else { - return this.aiDisplayMaster.length; - } - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsDisplay, 10); - } else { - return this.aiDisplay.length; - } - }, - - /** - * Set the display end point - aiDisplay index - * @type function - * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here - */ - "fnDisplayEnd": function () - { - if ( this.oFeatures.bServerSide ) { - if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) { - return this._iDisplayStart+this.aiDisplay.length; - } else { - return Math.min( this._iDisplayStart+this._iDisplayLength, - this._iRecordsDisplay ); - } - } else { - return this._iDisplayEnd; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null - }; - - /** - * Extension object for DataTables that is used to provide all extension options. - * - * Note that the <i>DataTable.ext</i> object is available through - * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is - * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - DataTable.ext = $.extend( true, {}, DataTable.models.ext ); - - $.extend( DataTable.ext.oStdClasses, { - "sTable": "dataTable", - - /* Two buttons buttons */ - "sPagePrevEnabled": "paginate_enabled_previous", - "sPagePrevDisabled": "paginate_disabled_previous", - "sPageNextEnabled": "paginate_enabled_next", - "sPageNextDisabled": "paginate_disabled_next", - "sPageJUINext": "", - "sPageJUIPrev": "", - - /* Full numbers paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "paginate_active", - "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled", - "sPageFirst": "first", - "sPagePrevious": "previous", - "sPageNext": "next", - "sPageLast": "last", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sFooterTH": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, { - /* Two buttons buttons */ - "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left", - "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled", - "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right", - "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled", - "sPageJUINext": "ui-icon ui-icon-circle-arrow-e", - "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w", - - /* Full numbers paging buttons */ - "sPageButton": "fg-button ui-button ui-state-default", - "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageFirst": "first ui-corner-tl ui-corner-bl", - "sPageLast": "last ui-corner-tr ui-corner-br", - - /* Features */ - "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ - "ui-buttonset-multi paging_", /* Note that the type is postfixed */ - - /* Sorting */ - "sSortAsc": "ui-state-default", - "sSortDesc": "ui-state-default", - "sSortable": "ui-state-default", - "sSortableAsc": "ui-state-default", - "sSortableDesc": "ui-state-default", - "sSortableNone": "ui-state-default", - "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n", - "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s", - "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s", - "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n", - "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s", - "sSortJUIWrapper": "DataTables_sort_wrapper", - "sSortIcon": "DataTables_sort_icon", - - /* Scrolling */ - "sScrollHead": "dataTables_scrollHead ui-state-default", - "sScrollFoot": "dataTables_scrollFoot ui-state-default", - - /* Misc */ - "sFooterTH": "ui-state-default", - "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix", - "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix" - } ); - - - /* - * Variable: oPagination - * Purpose: - * Scope: jQuery.fn.dataTableExt - */ - $.extend( DataTable.ext.oPagination, { - /* - * Variable: two_button - * Purpose: Standard two button (forward/back) pagination - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "two_button": { - /* - * Function: oPagination.two_button.fnInit - * Purpose: Initialise dom elements required for pagination with forward/back buttons only - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * node:nPaging - the DIV which contains this pagination control - * function:fnCallbackDraw - draw function which must be called on update - */ - "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) - { - var oLang = oSettings.oLanguage.oPaginate; - var oClasses = oSettings.oClasses; - var fnClickHandler = function ( e ) { - if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) - { - fnCallbackDraw( oSettings ); - } - }; - - var sAppend = (!oSettings.bJUI) ? - '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+ - '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>' - : - '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+ - '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>'; - $(nPaging).append( sAppend ); - - var els = $('a', nPaging); - var nPrevious = els[0], - nNext = els[1]; - - oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nPrevious.id = oSettings.sTableId+'_previous'; - nNext.id = oSettings.sTableId+'_next'; - - nPrevious.setAttribute('aria-controls', oSettings.sTableId); - nNext.setAttribute('aria-controls', oSettings.sTableId); - } - }, - - /* - * Function: oPagination.two_button.fnUpdate - * Purpose: Update the two button pagination at the end of the draw - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var oClasses = oSettings.oClasses; - var an = oSettings.aanFeatures.p; - - /* Loop over each instance of the pager */ - for ( var i=0, iLen=an.length ; i<iLen ; i++ ) - { - if ( an[i].childNodes.length !== 0 ) - { - an[i].childNodes[0].className = ( oSettings._iDisplayStart === 0 ) ? - oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled; - - an[i].childNodes[1].className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? - oClasses.sPageNextDisabled : oClasses.sPageNextEnabled; - } - } - } - }, - - - /* - * Variable: iFullNumbersShowPages - * Purpose: Change the number of pages which can be seen - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "iFullNumbersShowPages": 5, - - /* - * Variable: full_numbers - * Purpose: Full numbers pagination - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "full_numbers": { - /* - * Function: oPagination.full_numbers.fnInit - * Purpose: Initialise dom elements required for pagination with a list of the pages - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * node:nPaging - the DIV which contains this pagination control - * function:fnCallbackDraw - draw function which must be called on update - */ - "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) - { - var oLang = oSettings.oLanguage.oPaginate; - var oClasses = oSettings.oClasses; - var fnClickHandler = function ( e ) { - if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) - { - fnCallbackDraw( oSettings ); - } - }; - - $(nPaging).append( - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+ - '<span></span>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+ - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>' - ); - var els = $('a', nPaging); - var nFirst = els[0], - nPrev = els[1], - nNext = els[2], - nLast = els[3]; - - oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nFirst.id =oSettings.sTableId+'_first'; - nPrev.id =oSettings.sTableId+'_previous'; - nNext.id =oSettings.sTableId+'_next'; - nLast.id =oSettings.sTableId+'_last'; - } - }, - - /* - * Function: oPagination.full_numbers.fnUpdate - * Purpose: Update the list of page buttons shows - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages; - var iPageCountHalf = Math.floor(iPageCount / 2); - var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); - var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; - var sList = ""; - var iStartButton, iEndButton, i, iLen; - var oClasses = oSettings.oClasses; - var anButtons, anStatic, nPaginateList; - var an = oSettings.aanFeatures.p; - var fnBind = function (j) { - oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) { - /* Use the information in the element to jump to the required page */ - oSettings.oApi._fnPageChange( oSettings, e.data.page ); - fnCallbackDraw( oSettings ); - e.preventDefault(); - } ); - }; - - /* Pages calculation */ - if ( oSettings._iDisplayLength === -1 ) - { - iStartButton = 1; - iEndButton = 1; - iCurrentPage = 1; - } - else if (iPages < iPageCount) - { - iStartButton = 1; - iEndButton = iPages; - } - else if (iCurrentPage <= iPageCountHalf) - { - iStartButton = 1; - iEndButton = iPageCount; - } - else if (iCurrentPage >= (iPages - iPageCountHalf)) - { - iStartButton = iPages - iPageCount + 1; - iEndButton = iPages; - } - else - { - iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; - iEndButton = iStartButton + iPageCount - 1; - } - - - /* Build the dynamic list */ - for ( i=iStartButton ; i<=iEndButton ; i++ ) - { - sList += (iCurrentPage !== i) ? - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' : - '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>'; - } - - /* Loop over each instance of the pager */ - for ( i=0, iLen=an.length ; i<iLen ; i++ ) - { - if ( an[i].childNodes.length === 0 ) - { - continue; - } - - /* Build up the dynamic list forst - html and listeners */ - $('span:eq(0)', an[i]) - .html( sList ) - .children('a').each( fnBind ); - - /* Update the premanent botton's classes */ - anButtons = an[i].getElementsByTagName('a'); - anStatic = [ - anButtons[0], anButtons[1], - anButtons[anButtons.length-2], anButtons[anButtons.length-1] - ]; - - $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled ); - $([anStatic[0], anStatic[1]]).addClass( - (iCurrentPage==1) ? - oClasses.sPageButtonStaticDisabled : - oClasses.sPageButton - ); - $([anStatic[2], anStatic[3]]).addClass( - (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ? - oClasses.sPageButtonStaticDisabled : - oClasses.sPageButton - ); - } - } - } - } ); - - $.extend( DataTable.ext.oSort, { - /* - * text sorting - */ - "string-pre": function ( a ) - { - if ( typeof a != 'string' ) { - a = (a !== null && a.toString) ? a.toString() : ''; - } - return a.toLowerCase(); - }, - - "string-asc": function ( x, y ) - { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * html sorting (ignore html tags) - */ - "html-pre": function ( a ) - { - return a.replace( /<.*?>/g, "" ).toLowerCase(); - }, - - "html-asc": function ( x, y ) - { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "html-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * date sorting - */ - "date-pre": function ( a ) - { - var x = Date.parse( a ); - - if ( isNaN(x) || x==="" ) - { - x = Date.parse( "01/01/1970 00:00:00" ); - } - return x; - }, - - "date-asc": function ( x, y ) - { - return x - y; - }, - - "date-desc": function ( x, y ) - { - return y - x; - }, - - - /* - * numerical sorting - */ - "numeric-pre": function ( a ) - { - return (a=="-" || a==="") ? 0 : a*1; - }, - - "numeric-asc": function ( x, y ) - { - return x - y; - }, - - "numeric-desc": function ( x, y ) - { - return y - x; - } - } ); - - - $.extend( DataTable.ext.aTypes, [ - /* - * Function: - - * Purpose: Check to see if a string is numeric - * Returns: string:'numeric' or null - * Inputs: mixed:sText - string to check - */ - function ( sData ) - { - /* Allow zero length strings as a number */ - if ( typeof sData === 'number' ) - { - return 'numeric'; - } - else if ( typeof sData !== 'string' ) - { - return null; - } - - var sValidFirstChars = "0123456789-"; - var sValidChars = "0123456789."; - var Char; - var bDecimal = false; - - /* Check for a valid first char (no period and allow negatives) */ - Char = sData.charAt(0); - if (sValidFirstChars.indexOf(Char) == -1) - { - return null; - } - - /* Check all the other characters are valid */ - for ( var i=1 ; i<sData.length ; i++ ) - { - Char = sData.charAt(i); - if (sValidChars.indexOf(Char) == -1) - { - return null; - } - - /* Only allowed one decimal place... */ - if ( Char == "." ) - { - if ( bDecimal ) - { - return null; - } - bDecimal = true; - } - } - - return 'numeric'; - }, - - /* - * Function: - - * Purpose: Check to see if a string is actually a formatted date - * Returns: string:'date' or null - * Inputs: string:sText - string to check - */ - function ( sData ) - { - var iParse = Date.parse(sData); - if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) ) - { - return 'date'; - } - return null; - }, - - /* - * Function: - - * Purpose: Check to see if a string should be treated as an HTML string - * Returns: string:'html' or null - * Inputs: string:sText - string to check - */ - function ( sData ) - { - if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 ) - { - return 'html'; - } - return null; - } - ] ); - - - // jQuery aliases - $.fn.DataTable = DataTable; - $.fn.dataTable = DataTable; - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same point as - * fnDrawCallback. This may be useful for binding events or performing calculations when - * the table is altered at all. - * @name DataTable#draw - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Filter event, fired when the filtering applied to the table (using the build in global - * global filter, or column filters) is altered. - * @name DataTable#filter - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Sort event, fired when the sorting applied to the table is altered. - * @name DataTable#sort - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully drawn, - * including Ajax data loaded, if Ajax data is required. - * @name DataTable#init - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used</li></ol> - */ - - /** - * State save event, fired when the table has changed state a new state save is required. - * This method allows modification of the state saving object prior to actually doing the - * save, including addition or other state properties (for plug-ins) or modification - * of a DataTables core property. - * @name DataTable#stateSaveParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state - allowing modification - * of the saved state is required or loading of state for a plug-in. - * @name DataTable#stateLoadParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and the settings - * object has been modified by the loaded data. - * @name DataTable#stateLoaded - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing (be it, - * sort, filter or anything else). Can be used to indicate to the end user that - * there is something happening, or that something has finished. - * @name DataTable#processing - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to - * made to the server for new data (note that this trigger is called in fnServerData, - * if you override fnServerData and which to use this event, you need to trigger it in - * you success function). - * @name DataTable#xhr - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing - * the bDestroy:true parameter in the initialisation object. This can be used to remove - * bound events, added DOM nodes, etc. - * @name DataTable#destroy - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ -}(jQuery, window, document, undefined)); diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.fixheadertable.js b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.fixheadertable.js deleted file mode 100644 index 9cfe00a5f2f845d1ae6015abf2db9e76404174a3..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/js/jquery.fixheadertable.js +++ /dev/null @@ -1,990 +0,0 @@ -/* -* jquery.fixheadertable -* -* Copyright (c) 2010 Benjamin Léouzon -* http://www.tablefixedheader.com/ -* -* Licensed under MIT -* http://www.opensource.org/licenses/mit-license.php -* -* http://docs.jquery.com/Plugins/Authoring -* jQuery authoring guidelines -* -* Launch : December 2010 -* Version : 2.0 -*/ - -(function($) { - - $.fn.fixheadertable = function(options) { - - var defaults = { - - caption : '', - - showhide : true, - - theme : 'ui', - - height : null, - - width : null, - - minWidth : null, - - minWidthAuto : false, - - colratio : [], - - whiteSpace : 'nowrap', - - addTitles : false, - - zebra : false, - - zebraClass : 'ui-state-active', - - sortable : false, - - sortedColId : null, - - sortType : [], - - dateFormat : 'd-m-y', - - pager : false, - - rowsPerPage : 10, - - resizeCol : false, - - minColWidth : 100, - - wrapper : true - }; - - var options = $.extend(defaults, options); - - function util_getComputedStyle(element, property) { - - if (element.currentStyle) { - - var y = x.currentStyle[property]; - - } else if (window.getComputedStyle) { - - var y = document.defaultView.getComputedStyle(element, null).getPropertyValue(property); - } - - return y; - } - - function util_getScrollbarWidth () { - - var inner = $('<p/>').addClass('t_fixed_header_scroll_inner'); - - var outer = $('<div/>').addClass('t_fixed_header_scroll_outer'); - - outer.append(inner); - - $(document.body).append(outer); - - var w1 = inner[0].offsetWidth; - - outer.css('overflow', 'scroll'); - - var w2 = inner[0].offsetWidth; - - if (w1 == w2) w2 = outer[0].clientWidth; - - outer.remove(); - - return (w1 - w2); - } - - function util_parseDate (format, date) { - - var tsp = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0}, k, hl, dM; - - if(date && date !== null && date !== undefined){ - - date = $.trim(date); - - date = date.split(/[\\\/:_;.\t\T\s-]/); - - format = format.split(/[\\\/:_;.\t\T\s-]/); - - var dfmt = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - - var afmt = ["am", "pm", "AM", "PM"]; - - var h12to24 = function(ampm, h){ - - if (ampm === 0){ if (h == 12) { h = 0;} } - - else { if (h != 12) { h += 12; } } - - return h; - }; - - for (k=0, hl=format.length; k < hl; k++){ - - if(format[k] == 'M') { - - dM = $.inArray(date[k],dfmt); - - if(dM !== -1 && dM < 12){date[k] = dM+1;} - } - - if(format[k] == 'F') { - - dM = $.inArray(date[k],dfmt); - - if(dM !== -1 && dM > 11){date[k] = dM+1-12;} - } - - if(format[k] == 'a') { - - dM = $.inArray(date[k],afmt); - - if(dM !== -1 && dM < 2 && date[k] == afmt[dM]){ - - date[k] = dM; - - tsp.h = h12to24(date[k], tsp.h); - } - } - - if(format[k] == 'A') { - - dM = $.inArray(date[k],afmt); - - if(dM !== -1 && dM > 1 && date[k] == afmt[dM]){ - - date[k] = dM-2; - - tsp.h = h12to24(date[k], tsp.h); - } - } - - if(date[k] !== undefined) { - - tsp[format[k].toLowerCase()] = parseInt(date[k],10); - } - } - - tsp.m = parseInt(tsp.m,10)-1; - - var ty = tsp.y; - - if (ty >= 70 && ty <= 99) {tsp.y = 1900 + tsp.y;} - - else if (ty >=0 && ty <=69) {tsp.y= 2000 + tsp.y;} - } - - return new Date(tsp.y, tsp.m, tsp.d, tsp.h, tsp.i, tsp.s,0); - } - - return this.each(function() { - - var _table = $(this); - - var main_wrapper = null; - - var nbcol = $('thead th', this).length; - - var _initialWidth = $(this).width(); - - var _wrapper = null; - - var _headerscontainer = null; - - var _fillScrollbar = null; - - var _body = null; - - var _headers = null; - - var _scrollWidth = util_getScrollbarWidth(); - - var _colgroup = buildColgroup(nbcol); - - var _colgroup_body = null; - - var _nbRowsPerPage = 10; - - var _new_nbRowsPerPage = null; - - var _nbpages = null; - - var _nbpagesDiv = null; - - var _currentpage = null; - - var _pager = null; - - var _objectTable = null; - - var _stripNum = /[\$,%]/g; - - var _resizeInfo = null; - - var _resizeGhost = null; - - function buildTop (table) { - - _fillScrollbar = $('<div class="headtable ui-state-default" style="margin-right : 0px"></div>'); - - _headerscontainer = _fillScrollbar; - - _headerscontainer.insertBefore(table); - } - - function buildColgroup (nbcol) { - - var colgroup = $('<colgroup />'); - - if (options.colratio.length == 0) { - - var temp = null; - - for (var i = 0; i < nbcol; i++) { - - temp = $('<col style="width : ' + (100/nbcol) + '%" />'); - - colgroup.append(temp); - - temp = null; - } - - } else if (options.colratio.length == nbcol) { - - var cw = 0; - - for (var i = 0; i < nbcol; i++) { - - temp = $('<col style="width : ' + options.colratio[i] + 'px" />'); - - colgroup.append(temp); - - temp = null; - - cw += parseInt(options.colratio[i]); - } - - $(_table).css('width', cw + 'px'); - } - - return colgroup; - } - - function sortColumn (table, number, sens, th) { - - if ((options.sortType.length != 0) && (options.sortType.length == nbcol)) { - - var type = options.sortType[number]; - - if (type == 'float') { - - getSortKey = function(cell) { - - var key = parseFloat( String(cell).replace(_stripNum, '')); - - return isNaN(key) ? 0.00 : key; - } - - } else if (type == 'integer') { - - getSortKey = function(cell) { - - return cell ? parseFloat(String(cell).replace(_stripNum, '')) : 0; - } - - } else if (type == 'date') { - - getSortKey = function(cell) { - - return util_parseDate(options.dateFormat, cell).getTime(); - } - - } else { - - getSortKey = function(cell) { - - if(!cell) { cell =""; } - - return $.trim(String(cell).toLowerCase()); - } - } - - } else { - - getSortKey = function(cell) { - - if(!cell) { cell =""; } - - return $.trim(String(cell).toLowerCase()); - } - } - - _objectTable.sort(function(a, b){ - - var x = getSortKey(a[number]); - - var y = getSortKey(b[number]); - - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }) - - if(sens == 'DESC'){ - - _objectTable.reverse(); - } - - (options.pager) ? moveToPage(table) : objectToTable(_objectTable, table); - } - - function objectToTable(objectArray, table) { - - var body = $('tbody', table); - - body.children().remove(); - - if(options.zebra){ - - for (var i = 0; i < objectArray.length; i++){ - - (i%2) ? (tr = $('<tr class="' + options.zebraClass + '"></tr>')) : (tr = $('<tr></tr>')); - - for (var j in objectArray[i]){ - - tr.append($('<td class="ui-widget-content"></td>').html(objectArray[i][j])); - } - - body.append(tr); - } - - } else { - - for (var i = 0; i < objectArray.length; i++){ - - tr = $('<tr></tr>'); - - for (var j in objectArray[i]){ - - tr.append($('<td class="ui-widget-content"></td>').html(objectArray[i][j])); - } - - body.append(tr); - } - } - } - - function tableToObject(table) { - - var objectArray = []; - - $('tr', table).each(function(i){ - - var data = {}; - - $('td', this).each(function(j){ - - data[j] = $(this).html(); - }) - - objectArray.push(data); - }); - - return objectArray; - } - - function buildHeaders(table) { - - _headers = $('<table class="head"/>').append(_colgroup).append($('thead', table)); - - _headerscontainer.append(_headers); - - _headers.wrap('<div></div>'); - - var tab_headers = $('th', _headers); - - tab_headers.addClass('ui-widget-content ui-state-default'); - - if(options.sortable){ - - var th_div_sort = null; - - tab_headers.each(function(i){ - - $(this).contents().wrapAll('<div class="ui-sort"></div>'); - - th_div_sort = $('div.ui-sort', this); - - th_div_sort.click(function(){ - - tab_headers.removeClass('ui-state-hover'); - - $(this).parent().removeClass('ui-state-active').addClass('ui-state-hover'); - - $('span.ui-icon', tab_headers).remove(); - - if($(this).hasClass('sortedUp')){ - - sortColumn(table, i, "DESC", this); - - $(this).removeClass('sortedUp').addClass('sortedDown'); - - $(this).append('<span style="display : inline-block; vertical-align : middle" class="ui-icon ui-icon-triangle-1-s"></span>'); - - } else { - - sortColumn(table, i, "ASC", this); - - $(this).removeClass('sortedDown').addClass('sortedUp'); - - $(this).append('<span style="display : inline-block; vertical-align : middle" class="ui-icon ui-icon-triangle-1-n"></span>'); - } - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - }) - }); - - $('div.ui-sort', tab_headers).addClass('hover'); - } - - if(options.resizeCol && (options.colratio.length == nbcol)){ - - tab_headers.each(function(i){ - - var resizer = $('<span class="ui-resize"></span>'); - - $(this).prepend(resizer); - - resizer.mousedown(function(e){ - - dragStart(i, e); - - return false; - }) - }); - - _main_wrapper.mousemove(function(e){ - - if (_resizeInfo){ - - dragMove(e); - - return false; - } - }).mouseup(function(){ - - if (_resizeInfo){ - - dragEnd(); - - return false; - } - - return true; - }); - - function getOffset(col){ - - var ret = 0, cell = $('col', _colgroup), handler = $('th > span.ui-resize', _headers)[col], bso = _body[0].scrollLeft; - - for(var i = 0; i < col; i++){ - - ret += parseInt(cell[i].style.width); - } - - return handler.offsetLeft + 5 + ret - bso; - } - - function dragStart(i, x){ - - _resizeInfo = { id : i, startX : x.clientX , initTableWidth : getColratioWidth(), offset : getOffset(i) }; - - _resizeGhost.css({ display : 'block', height : _headerscontainer.height() + _body.height() + 2 + 'px', left : _resizeInfo.offset + 'px', cursor : 'col-resize' }); - } - - function dragMove(x){ - - var diff = x.clientX - _resizeInfo.startX; - - _resizeInfo.newWidth = parseInt($('col', _colgroup)[_resizeInfo.id].style.width) + diff; - - _resizeInfo.newTableWidth = _resizeInfo.initTableWidth + diff; - - if(_resizeInfo.newWidth > parseInt(options.minColWidth)){ - - _resizeGhost.css({ left : _resizeInfo.offset + diff + 'px' }); - - } else { - - _resizeInfo.newWidth = parseInt(options.minColWidth); - } - } - - function dragEnd(){ - - $(_colgroup.children()[_resizeInfo.id]).css({ width : _resizeInfo.newWidth + 'px' }); - - $(_colgroup_body.children()[_resizeInfo.id]).css({ width : _resizeInfo.newWidth + 'px' }); - - var wrapper_width = _resizeInfo.newTableWidth; - - _headers.css({ 'width' : wrapper_width + 'px' }); - - $(_table).css({ 'width' : wrapper_width + 'px' }); - - _resizeInfo = null; - - _resizeGhost.css({ display : 'none' }); - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - } - } - } - - function isIE6_7() { - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - - var ieversion = new Number(RegExp.$1); - - if (ieversion == 7 || ieversion == 6) { - - return true; - - } else { - return false; - } - } - } - - function isIE8() { - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - - var ieversion = new Number(RegExp.$1); - - if (ieversion == 8) { - - return true; - - } else { - return false; - } - } - } - - function buildBody (table) { - - _body = $('<div class="body ui-widget-content"></div>').insertBefore(table).append(table); - - if(options.height != null && !isNaN(parseInt(options.height))) { - - _body.css('height', options.height + 'px'); - } - - _colgroup_body = _colgroup.clone(); - - $(table).prepend(_colgroup_body); - - $('td', table).addClass('ui-widget-content'); - - $(table).wrap('<div></div>'); - - if (options.addTitles == true) { - - $('td', table).each(function() { - - $(this).attr('title', $(this).text()); - }); - } - - if (options.zebra) { - - $('tr:odd', table).addClass(options.zebraClass); - } - } - - function adaptScroll (table) { - - var scrollwidth = _scrollWidth; - - if(isIE6_7()){ - - scrollwidth = 0; - } - - var width = 0; - - if (parseInt($(table).height()) > parseInt(options.height)) { - - width = scrollwidth; - - overflow = 'scroll'; - - } else { - - width = 0; - - overflow = 'auto'; - } - - if($.browser.msie && options.height) { - - width = scrollwidth; - - overflow = 'scroll'; - } - - _fillScrollbar.css('margin-right', width); - - return overflow; - } - - function restrictRows(table, nbrows) { - - var length = _objectTable.length; - - var limit = 0; - - if(length < nbrows) { - - limit = length; - - } else { - - limit = nbrows; - } - - var _objectTableSliced = _objectTable.slice(0, limit); - - objectToTable(_objectTableSliced, table); - - _nbpages = Math.ceil(length / nbrows); - - _currentpage = 1; - - _nbpagesDiv.html('Showing page ' + _currentpage + ' of ' + _nbpages); - - _body.css('overflow-y', adaptScroll(table)); - - $('tr:last td', table).css('border-bottom-width', '1px'); - } - - function moveToNextPage(table) { - - _currentpage++; - - if(_currentpage >= (_nbpages)) { - - _currentpage = (_nbpages); - } - - moveToPage(table); - } - - function moveToPreviousPage(table) { - - _currentpage--; - - if(_currentpage <= 1) { - - _currentpage = 1; - } - - moveToPage(table); - } - - function moveToPage(table) { - - var length = _objectTable.length; - - var start, limit = 0; - - start = (_currentpage - 1) * _new_nbRowsPerPage; - - if(length < (_currentpage * _new_nbRowsPerPage)) { - - limit = length; - - } else { - - limit = (_currentpage * _new_nbRowsPerPage); - } - - var _objectTableSliced = _objectTable.slice(start, limit); - - objectToTable(_objectTableSliced, table); - - _nbpagesDiv.html('Showing page ' + _currentpage + ' of ' + _nbpages); - - _body.css('overflow-y', adaptScroll(table)); - - $('tr:last td', table).css('border-bottom-width', '1px'); - } - - function buildNavButton(className, callbackClick, buttonClass) { - - var button = $('<div class="button ui-state-default ' + buttonClass + '"><span class="ui-icon ' + className + '"> </span></div>'); - - _pager.append(button); - - button.mouseover(function(){ - - $(this).addClass('ui-state-hover'); - - }).mousedown(function(){ - - $(this).addClass('ui-state-active'); - - }).mouseup(function(){ - - $(this).removeClass('ui-state-active'); - - }).mouseout(function(){ - - $(this).removeClass('ui-state-active'); - - $(this).removeClass('ui-state-hover'); - - }).click(callbackClick); - } - - function buildPager(table) { - - _pager = $('<div class="pager ui-widget-header ui-corner-bottom ui-widget-content"></div>'); - - _main_wrapper.append(_pager); - - buildNavButton('ui-icon-arrowthickstop-1-e', function(){ - - _currentpage = _nbpages; - - moveToPage(table); - }, 'ui-corner-right'); - - buildNavButton('ui-icon ui-icon-arrowthick-1-e', function(){ - - moveToNextPage(table); - }, 'noborder'); - - buildNavButton('ui-icon ui-icon-arrowthick-1-w', function(){ - - moveToPreviousPage(table); - }, 'noborder'); - - buildNavButton('ui-icon-arrowthickstop-1-w', function(){ - - _currentpage = 1; - - moveToPage(table); - }, 'ui-corner-left noborder'); - - _button_set = - - $('<div id="' + table.id + '_radio" style="float : left">' + - - '<input type="radio" id="' + table.id + '_show_10_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_10_rows">10</label>' + - '<input type="radio" id="' + table.id + '_show_25_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_25_rows">25</label>' + - '<input type="radio" id="' + table.id + '_show_50_rows" name="' + table.id + '_radio" /><label for="' + table.id + '_show_50_rows">50</label>' + - '<input type="radio" id="' + table.id + '_show_100_rows" name="' + table.id + '_radio"/><label for="' + table.id + '_show_100_rows">100</label>' + - - '</div>'); - - _pager.append(_button_set); - - $('#' + table.id + '_show_10_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_25_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 2.5; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_50_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 5; - - restrictRows(table, _new_nbRowsPerPage); - }); - - $('#' + table.id + '_show_100_rows', _pager).click(function(){ - - _new_nbRowsPerPage = _nbRowsPerPage * 10; - - restrictRows(table, _new_nbRowsPerPage); - }); - - _nbpagesDiv = $('<div class="page_infos"></div>'); - - _pager.append(_nbpagesDiv); - - _new_nbRowsPerPage = _nbRowsPerPage; - - $('#' + table.id + '_show_' + options.rowsPerPage + '_rows', _pager).click(); - - _button_set.buttonset(); - } - - function getColratioWidth(){ - - var tw = 0; - - for(var i = 0; i < options.colratio.length; i++){ - - tw += parseInt(options.colratio[i]); - } - - return tw; - } - - /***********************/ - /********* MAIN ********/ - /***********************/ - - _wrapper = $('<div/>').addClass('t_fixed_header ui-state-default default ' + options.theme).insertBefore(this).append(this); - - _wrapper.css('border', 'none').css('font-weight', 'normal'); - - _main_wrapper = $('<div class="t_fixed_header_main_wrapper ui-widget ui-widget-header ' + options.theme + '"></div>'); - - if (options.whiteSpace == 'normal') { - - _wrapper.addClass('t_fixed_header_wrap'); - } - - buildTop(this); - - buildHeaders(this); - - buildBody(this); - - if(options.wrapper){ - - var tampon = _wrapper.wrap('<div class="ui-widget ui-widget-content ui-corner-all" style="padding : 5px; font-size : 1em;"></div>').parent(); - - } else { - - var tampon = _wrapper.wrap('<div></div>').parent(); - } - - if (options.width != null && !isNaN(parseInt(options.width)) && options.width > 0) { - - tampon.css('width', options.width + 'px'); - } - - var res = _wrapper.detach(); - - var main_wrapper_child = $('<div class="t_fixed_header_main_wrapper_child"></div>'); - - _main_wrapper.append(main_wrapper_child); - - main_wrapper_child.append(res); - - tampon.append(_main_wrapper); - - if(isIE6_7()){ - - _body.css('margin-bottom', 17 + 'px'); - } - - if (options.caption != '') { - - var caption = $('<div class="t_fixed_header_caption ui-widget-header ui-corner-top">' + options.caption + '</div>'); - - _main_wrapper.prepend(caption).addClass('ui-corner-all'); - - if (options.showhide) { - - var showhide = $('<div style="cursor : pointer; display : inline-block; vertical-align : middle; background : none; border : none;" class="ui-state-active"><span class="ui-icon ui-icon-triangle-1-n"> </span></div>'); - - caption.append(showhide); - - showhide.click(function(){ - - main_wrapper_child.toggle(); - - caption.toggleClass('toggle') - - if(_pager) _pager.toggle(); - - $('span', showhide).toggleClass('ui-icon-triangle-1-s'); - }); - - } - } - - if (options.sortable || options.pager) { - - _objectTable = tableToObject(this); - } - - if (options.pager) { - - buildPager(this); - } - - if(options.sortable && !isNaN(parseInt(options.sortedColId))) { - - var cur_th = $('th', _headers)[options.sortedColId]; - - $(cur_th).addClass('ui-state-hover') - - $('div.ui-sort', cur_th).click(); - } - - if(options.resizeCol && (options.colratio.length == nbcol)){ - - _resizeGhost = $('<div class="ui-resize-ghost ui-widget-header" style="height : ' + _main_wrapper.parent().height() + 'px"></div>'); - - _wrapper.append(_resizeGhost); - } - - _body.css('overflow-y', adaptScroll(this)); - - if (options.minWidth != null && !isNaN(parseInt(options.minWidth)) && options.minWidth > 0) { - - var minWidth = options.minWidth + 'px'; - - } else if (options.minWidthAuto) { - - if (options.colratio.length == nbcol) { - - var minWidth = $(this).width() + 'px'; - - } else { - - var minWidth = (_initialWidth + 150) + 'px'; - } - } - - _headerscontainer.children().first().css('min-width', minWidth); - - _body.children().first().css('min-width', minWidth); - - _body.scroll(function(){ - - _headerscontainer[0].scrollLeft = _body[0].scrollLeft; - }); - - if (options.colratio.length == nbcol) { - - _wrapper.removeClass('default'); - - $(_headers).css('width', getColratioWidth() + 'px'); - } - }); - }; - -})(jQuery); \ No newline at end of file diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/media-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/media-browser.html deleted file mode 100644 index c29fc4da7cc3d69582843d84e0983a294de46896..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/media-browser.html +++ /dev/null @@ -1,979 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Media</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="media-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>For What</th><th>Organism</th><th></th></tr> - </thead> - <tbody id='media-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All media -var medias = null; - -/// The media that are currently being inspected -var inspectedMedias = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - console.log(sample.properties.SOLUTIONS_BUFFERS_PARENTS) - } - - -} - - -}; - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - media = objectOrId; - } else { - media = mediasById[objectOrId]; - } - - return media; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the medias variable */ -function initializeMedias(result) -{ - // Construct a map of all medias by id - mediasById = {}; - - // Split the medias into two groups, the ones that start with FRP in their sample name and the other ones. - var frpMedias = [], otherMedias = []; - var frpRegex = /^FRM[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - mediasById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the mediasById map - theSample = mediasById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpMedias.push(theSample); - } else { - otherMedias.push(theSample); - } - initializeSyntheticProperties(theSample); - - }); - - // Sort each of the groups - otherMedias.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpMedias.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of medias - medias = frpMedias.concat(otherMedias); -} - - - - -/** Set the size of the media-table based on whether or not inspectors are visible */ -function resizeMediaTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var mediaTableTransition = d3.selectAll('div.media-table-data-cell'); - mediaTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectMedia(media) -{ - if (inspectedMedias.indexOf(media) < 0) { - inspectedMedias.push(media); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var mediaToSend = $.extend({}, media); - delete mediaToSend.parents; - delete mediaToSend.children; - - } - resizeMediaTable(); - updateInspectors(1000); -} - -function closeInspector(media) -{ - var index = inspectedMedias.indexOf(media); - if (index < 0) { - return; - } - - inspectedMedias.splice(index, 1); - resizeMediaTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedMedias, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectMedia(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectMedia(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeMedias(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (medias.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#media-table").selectAll("tr.media-table-data").data(medias); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "media-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectMedia) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.FOR_WHAT, sample.properties.ORGANISM]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "media-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); - -} - -function mediaFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#media-table").selectAll("tr.media-table-data").data(medias); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedMedias) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "MEDIA" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/oligo-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/oligo-browser.html deleted file mode 100644 index 7ac99f79c3792ed9b4e64282849bb2fe9f10abe2..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/oligo-browser.html +++ /dev/null @@ -1,599 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -// Some global variables we refer to - -/// All oligos -var oligos = null; - -/// The oligos that are currently being inspected -var inspectedOligos = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order1 = ["TARGET", "DIRECTION", "RESTRICTION_ENZYME", "MODIFICATIONS", "SEQUENCE", "PROJECT"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order2 = [ "BOX_NUMBER", "ROW", "COLUMN","REGISTRATION_DATE"] - new_list2 = [] - for (var a in order2) { - for (var b in pairs) { - if (pairs[b][0] == order2[a]) { - new_list2.push(pairs[b]); - break; - } - } - } - - return new_list2; -} - - - -/** Initialize the oligos variable */ -function initializeOligos(result) -{ - // Split the oligos into two groups, the ones that start with FRO in their sample name and the other ones. - var froOligos = [], otherOligos = []; - var froRegex = /^FRO[0-9]+/; - froRegex.compile(froRegex); - result.forEach(function(sample) { - if (froRegex.test(sample.code)) { - froOligos.push(sample); - } else { - otherOligos.push(sample); - } - }); - - // Sort each of the groups - otherOligos.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - froOligos.sort(function(a, b) { - // Sort based on the FRO number - var froNumberA = parseInt(a.code.substring(3)); - var froNumberB = parseInt(b.code.substring(3)); - return (froNumberA < froNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of oligos - oligos = froOligos.concat(otherOligos); -} - -/** Set the size of the oligo-table based on whether or not inspectors are visible */ -function resizeOligoTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%" - areInspectorsVisible = true; - - var oligoTableTransition = d3.selectAll('div.oligo-table-data-cell'); - oligoTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectOligo(oligo) -{ - if (inspectedOligos.indexOf(oligo) < 0) { - inspectedOligos.push(oligo); - openbisServer.listDataSetsForSample(oligo, true, dataset.curry(oligo)); - } - resizeOligoTable(); - updateInspectors(1000); -} - -function closeInspector(oligo) -{ - var index = inspectedOligos.indexOf(oligo); - if (index < 0) { - return; - } - - inspectedOligos.splice(index, 1); - resizeOligoTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedOligos, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeOligos(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (oligos.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "oligo-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectOligo) - .selectAll("td").data(function(sample) { - var tableFields = [sample.identifier.slice(11,50), sample.properties.TARGET, sample.properties.DIRECTION,sample.properties.RESTRICTION_ENZYME, sample.properties.PROJECT]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "oligo-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function oligoFilter(filter, property, element, index, array) { - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(codeFilterText, targetFilterText, directionFilterText, enzymeFilterText, projectFilterText) -{ - if (codeFilterText == undefined) - { - codeFilterText = ""; - } - - if (targetFilterText == undefined) - { - targetFilterText = ""; - } - - if (directionFilterText == undefined) - { - directionFilterText = ""; - } - - if (enzymeFilterText == undefined) - { - enzymeFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - var displayedOligos = oligos.filter(oligoFilter.curry(codeFilterText, "CODE")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(targetFilterText, "TARGET")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(directionFilterText, "DIRECTION")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(enzymeFilterText, "RESTRICTION_ENZYME")); - displayedOligos = displayedOligos.filter(oligoFilter.curry(projectFilterText, "PROJECT")); - - - var selection2 = d3.select("#vis").select("#oligo-table").selectAll("tr.oligo-table-data").data(oligos); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedOligos) != -1) { - return "table-row" - } else { - return "none" - } - }); - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "OLIGO" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamples(sampleCriteria, displayReturnedSamples); - -} - - - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#code_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#target_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#direction_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#enzyme_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#code_filter').val(), $('#target_filter').val(), $('#direction_filter').val(), $('#enzyme_filter').val(), $('#project_filter').val()); - }); - - - - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - -</script> - -</head> -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Oligos</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr> - <td></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Target filter" id="target_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Direction Num filter" id="direction_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Enzyme Name filter" id="enzyme_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Project filter" id="project_filter" type="text"></td> - </tr> - <tr class="oligo-table-header"><th>Code</th><th>Target</th><th>Direction</th><th>Restriction Enzyme</th><th>Project</th><th></th></tr> - </thead> - <tbody id='oligo-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/pcr-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/pcr-browser.html deleted file mode 100644 index ac74912319b4e446b560464685dcf441613fa307..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/pcr-browser.html +++ /dev/null @@ -1,1009 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">PCR</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="pcr-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Template</th><th>Publication</th><th></th></tr> - </thead> - <tbody id='pcr-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All pcr -var pcrs = null; - -/// The pcr that are currently being inspected -var inspectedpcrs = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["PROCEDURE", "pcr_EVALUATION", "DETAILS", "COMMENTS", "PUBLICATION"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS", "GENERAL_pcr_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","SUGGESTIONS", "pcr_MODIFICATIONS", "REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - pcr = objectOrId; - } else { - pcr = pcrsById[objectOrId]; - } - - return pcr; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the pcrs variable */ -function initializepcrs(result) -{ - // Construct a map of all pcrs by id - pcrsById = {}; - - // Split the pcrs into two groups, the ones that start with FRP in their sample name and the other ones. - var frppcrs = [], otherpcrs = []; - var frpRegex = /^FRPROT[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - pcrsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the pcrsById map - theSample = pcrsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frppcrs.push(theSample); - } else { - otherpcrs.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherpcrs.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frppcrs.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of pcrs - pcrs = frppcrs.concat(otherpcrs); -} - - - - -/** Set the size of the pcr-table based on whether or not inspectors are visible */ -function resizepcrTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var pcrTableTransition = d3.selectAll('div.pcr-table-data-cell'); - pcrTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectpcr(pcr) -{ - if (inspectedpcrs.indexOf(pcr) < 0) { - inspectedpcrs.push(pcr); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var pcrToSend = $.extend({}, pcr); - delete pcrToSend.parents; - delete pcrToSend.children; - - } - resizepcrTable(); - updateInspectors(1000); -} - -function closeInspector(pcr) -{ - var index = inspectedpcrs.indexOf(pcr); - if (index < 0) { - return; - } - - inspectedpcrs.splice(index, 1); - resizepcrTable(); - updateInspectors(1000); -} - - - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedpcrs, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectpcr(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectpcr(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializepcrs(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (pcrs.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#pcr-table").selectAll("tr.pcr-table-data").data(pcrs); - // Code under enter is run if there is no HTML element for a data element - - - - selection - .enter() - .append("tr") - .attr("class", "pcr-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectpcr) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.TEMPLATE, sample.properties.PUBLICATION]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "pcr-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function pcrFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#pcr-table").selectAll("tr.pcr-table-data").data(pcrs); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedpcrs) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PCR" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/plasmid-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/plasmid-browser.html deleted file mode 100644 index 2971d8e1639bbd16e3fa0f1e19450223bca389ec..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/plasmid-browser.html +++ /dev/null @@ -1,827 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Plasmids</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr> - <td></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Owner filter" id="owner_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Owner Num filter" id="ownerNum_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Plasmid Name filter" id="plasmidName_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Backbone filter" id="backbone_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Antibiotic filter" id="antibiotic_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Marker filter" id="marker_filter" type="text"></td> - </tr> - <tr class="plasmid-table-header"><th>Code</th><th>Owner</th><th>Owner Number</th><th>Plasmid Name</th><th>Backbone</th><th>Bacterial Antibiotic Resistance</th><th>(Yeast) Marker</th><th></th></tr> - </thead> - <tbody id='plasmid-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -//openbisServer = new openbis('https://localhost:8443/openbis/openbis', 'https://bs-mbp156.ethz.ch:8443/datastore_server'); - - -// Some global variables we refer to - -/// All plasmids -var plasmids = null; - -/// The plasmids that are currently being inspected -var inspectedPlasmids = []; - -/// The width of the inspectors section -var inspectorsWidth = 500; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS", "YEAST_PARENTS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - plasmid = objectOrId; - } else { - plasmid = plasmidsById[objectOrId]; - } - - return plasmid; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the plasmids variable */ -function initializePlasmids(result) -{ - // Construct a map of all plasmids by id - plasmidsById = {}; - - // Split the plasmids into two groups, the ones that start with FRP in their sample name and the other ones. - var frpPlasmids = [], otherPlasmids = []; - var frpRegex = /^FRP[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach( - function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - plasmidsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) {referredSample.parents.forEach(storeSamplesById);} - if (referredSample.children) {referredSample.children.forEach(storeSamplesById);} - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the plasmidsById map - theSample = plasmidsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpPlasmids.push(theSample); - } else { - otherPlasmids.push(theSample); - } - }); - - // Sort each of the groups - otherPlasmids.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpPlasmids.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(3)); - var frpNumberB = parseInt(b.code.substring(3)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of plasmids - plasmids = frpPlasmids.concat(otherPlasmids); -} - - - - -/** Set the size of the plasmid-table based on whether or not inspectors are visible */ -function resizePlasmidTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - if (inspectedPlasmids.length > 0) { - cellWidth = ((getAppWidth() - inspectorsWidth) / 9) - padding + "px"; - console.log(cellWidth) - areInspectorsVisible = true; - } else { - cellWidth = "100%"; - areInspectorsVisible = false; - } - var plasmidTableTransition = d3.selectAll('div.plasmid-table-data-cell'); - plasmidTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectPlasmid(plasmid) -{ - if (inspectedPlasmids.indexOf(plasmid) < 0) { - inspectedPlasmids.push(plasmid); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var plasmidToSend = $.extend({}, plasmid); - delete plasmidToSend.parents; - delete plasmidToSend.children; - openbisServer.listDataSetsForSample(plasmidToSend, true, dataset.curry(plasmid)); - } - resizePlasmidTable(); - updateInspectors(1000); -} - -function closeInspector(plasmid) -{ - var index = inspectedPlasmids.indexOf(plasmid); - if (index < 0) { - return; - } - - inspectedPlasmids.splice(index, 1); - resizePlasmidTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedPlasmids, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectPlasmid(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializePlasmids(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (plasmids.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "plasmid-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectPlasmid) - .selectAll("td").data(function(sample) { - var tableFields = [sample.identifier.slice(11,50), sample.properties.OWNER.split('_').join(" "), sample.properties.OWNER_NUMBER, sample.properties.PLASMID_NAME, sample.properties.BACKBONE.split('_').join(' '), sample.properties.BACTERIAL_ANTIBIOTIC_RESISTANCE,sample.properties.YEAST_MARKER]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "plasmid-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function plasmidFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, plasmidNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (plasmidNameFilterText == undefined) - { - plasmidNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedPlasmids = plasmids.filter(plasmidFilter.curry(ownerFilterText, "OWNER")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(plasmidNameFilterText, "PLASMID_NAME")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(backboneFilterText, "BACKBONE")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedPlasmids = displayedPlasmids.filter(plasmidFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#plasmid-table").selectAll("tr.plasmid-table-data").data(plasmids); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedPlasmids) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "PLASMID" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#plasmidName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#plasmidName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/search-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/search-browser.html deleted file mode 100644 index 21ec57c6e9eb1956ef5eb56dcbcee21aa1a0c0d7..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/search-browser.html +++ /dev/null @@ -1,409 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - -//openbisServer = new openbis("/openbis/openbis", "https://localhost:8444/datastore_server") -// Some global variables we refer to - -/// All eachsamples -var eachsamples = null; - -/// The eachsamples that are currently being inspected -var inspectedEachsamples = []; - - - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -/** Initialize the eachsamples variable */ -function initializeEachsamples(result) -{ - // Split the eachsamples into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all eachsamples by id - eachsamplesById = {}; - - // Split the eachsamples into two groups, the ones that start with FRP in their sample name and the other ones. - var fryEachsamples = [], otherEachsamples = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - eachsamplesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the eachsamplesById map - theSample = eachsamplesById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryEachsamples.push(theSample); - } else { - otherEachsamples.push(theSample); - } - - }); - - // Sort each of the groups - otherEachsamples.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryEachsamples.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of eachsamples - eachsamples = fryEachsamples.concat(otherEachsamples); - console.log(eachsamples) -} - - - -/** Set the size of the eachsample-table based on whether or not inspectors are visible */ - - -function inspectEachsample(eachsample) -{ - if (null == eachsample) { - // Ignore this -- it is not a eachsample - return; - } - - - - window.open(eachsample.sampleTypeCode.toLowerCase() +"-browser.html?code=" + eachsample.code, "_blank"); - - -} - -function closeInspector(eachsample) -{ - var index = inspectedEachsamples.indexOf(eachsample); - if (index < 0) { - return; - } - - inspectedEachsamples.splice(index, 1); - resizeEachsampleTable(); - updateInspectors(1000); -} - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeEachsamples(data.result); - - - - - d3.select("#vis").select("#eachsample-table").selectAll("tr.eachsample-table-data").remove(); - var selection = d3.select("#vis").select("#eachsample-table").selectAll("tr.eachsample-table-data").data(eachsamples); - // Code under enter is run if there is no HTML element for a data element - - -var searchText = $('#search').val(); -var searchRegexpText = ("*" + searchText + "*").replace(/\*/g, ".*"); -var searchRegexp = new RegExp(searchRegexpText, "i"); - -selection - .enter() - .append("tr") - .attr("class", "eachsample-table-data") - .style("cursor", "pointer") - .on("click", inspectEachsample) - .selectAll("td").data(function(sample) { return [sample.sampleTypeCode, sample.identifier.slice(11,50), sample.properties, sample.properties ]; }) - .enter() - .append("td") - .append("div") - .attr("class", "eachsample-table-data-cell") - .text(function(d, index){ - if(index == 2){ - if(searchText && searchText.length > 0 && d){ - for(propertyName in d){ - var propertyValue = d[propertyName]; - if(propertyValue && searchRegexp.test(propertyValue)){ - return propertyValue; - } - } - } - } - else if (index ==3){ - if(searchText && searchText.length > 0 && d){ - for(propertyName in d){ - var propertyValue = d[propertyName]; - if(propertyValue && searchRegexp.test(propertyValue)){ - return propertyName; - } - } - } - } - else{ - return d; - } - - return "" - }) - -} - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - -function showSearchedSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AnyFieldMatchClause", - fieldType : "ANY_FIELD", - desiredValue : "*" + $("#search").val() + "*" - } - ], - operator : "MATCH_ANY_CLAUSES" -}; - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - - - -function showMatchingSamples() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute:"TYPE", - desiredValue : "*" - } - ], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - -function showMatchingField() -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute:"TYPE", - desiredValue : "*" - } - ], - operator : "MATCH_ANY_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], displayReturnedSamples); - -} - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - populateMenuNew(); - - //showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $("#search").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('#search').submit(); - return false; - } else { - return true; - } - }); - - $('#search').submit(function() { - showSearchedSamples(); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - -</script> - -</head> -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Search All Sample Types</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - - <div id="search-field"> - <form> <input id="search" type="text" class="search-query" placeholder="Search"> </form> - </div> - - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="eachsample-table-header"><th>Sample Type</th><th>Code</th><th>Matched Text</th><th>Matching Field</th></tr> - </thead> - <tbody id='eachsample-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html deleted file mode 100644 index 1fc3d644fd30e5d767ea70b88fdf17098cfdc5e5..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/solutions_buffers-browser.html +++ /dev/null @@ -1,984 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Solutions Buffers</h1> - </center> - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="buffer-table-header"><th>Code</th><th>Name</th><th>Storage</th><th>For What</th><th></th></tr> - </thead> - <tbody id='buffer-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - -// Some global variables we refer to - -/// All buffers -var buffers = null; - -/// The buffers that are currently being inspected -var inspectedbuffers = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var mediaValue = sample.properties.MEDIA; - sample.properties.MEDIA_PARENTS = []; - - if (!xmlValueRegex.test(mediaValue)) - return; - - globalValue = mediaValue; - var mediaXml = xmlParser.parseFromString(mediaValue, "text/xml"); - - - for (i=1; i < mediaXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = mediaXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var MEDIA_PARENTS = null; - - - MEDIA_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.MEDIA_PARENTS.push(MEDIA_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - console.log(sample.properties.SOLUTIONS_BUFFERS_PARENTS) - } - - -} - - -}; - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["NAME", "FOR_WHAT", "ORGANISM", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE","STOCK_CONCENTRATION", "STERILIZATION", "KIT" ] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["DETAILS", "COMMENTS", "PUBLICATION" ] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","MEDIA_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "XMLCOMMENTS","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - buffer = objectOrId; - } else { - buffer = buffersById[objectOrId]; - } - - return buffer; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the buffers variable */ -function initializebuffers(result) -{ - // Construct a map of all buffers by id - buffersById = {}; - - // Split the buffers into two groups, the ones that start with FRP in their sample name and the other ones. - var frpbuffers = [], otherbuffers = []; - var frpRegex = /^FRSOB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - buffersById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the buffersById map - theSample = buffersById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpbuffers.push(theSample); - } else { - otherbuffers.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherbuffers.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpbuffers.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(5)); - var frpNumberB = parseInt(b.code.substring(5)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of buffers - buffers = frpbuffers.concat(otherbuffers); -} - - - -/** Set the size of the buffer-table based on whether or not inspectors are visible */ -function resizebufferTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var bufferTableTransition = d3.selectAll('div.buffer-table-data-cell'); - bufferTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectbuffer(buffer) -{ - if (inspectedbuffers.indexOf(buffer) < 0) { - inspectedbuffers.push(buffer); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var bufferToSend = $.extend({}, buffer); - delete bufferToSend.parents; - delete bufferToSend.children; - openbisServer.listDataSetsForSample(bufferToSend, true, dataset.curry(buffer)); - } - resizebufferTable(); - updateInspectors(1000); -} - -function closeInspector(buffer) -{ - var index = inspectedbuffers.indexOf(buffer); - if (index < 0) { - return; - } - - inspectedbuffers.splice(index, 1); - resizebufferTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedbuffers, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbuffer(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectbuffer(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets -// var dataSetRow = box.select("table.properties").append("tr"); -// dataSetRow -// .append("td") -// .attr("class", "property") -// .text("DATA_SETS"); -// dataSetRow -// .append("td") -// .attr("class", "data_sets"); - - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializebuffers(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (buffers.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#buffer-table").selectAll("tr.buffer-table-data").data(buffers); - // Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "buffer-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectbuffer) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.STORAGE, sample.properties.FOR_WHAT]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "buffer-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function bufferFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, bufferNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (bufferNameFilterText == undefined) - { - bufferNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedbuffers = buffers.filter(bufferFilter.curry(ownerFilterText, "OWNER")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(bufferNameFilterText, "buffer_NAME")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(backboneFilterText, "BACKBONE")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedbuffers = displayedbuffers.filter(bufferFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#buffer-table").selectAll("tr.buffer-table-data").data(buffers); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedbuffers) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "SOLUTIONS_BUFFERS" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#bufferName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#bufferName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/template-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/template-browser.html deleted file mode 100644 index f4304eab78fee9baf9789061ea31828fbc63a5ad..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/template-browser.html +++ /dev/null @@ -1,919 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - -// Some global variables we refer to -var SAMPLE_TYPE = "TEMPLATE_SAMPLE"; -var SAMPLE_TYPE_PROPERTIES = ["TEMPLATE_DESCRIPTION", "TEMPLATE_NUMBER", "TEMPLATE_TEXT"]; -var SAMPLE_TYPE_PROPERTIES_DISPLAY_NAME = ["Description", "Number", "Text"]; - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var plasmidValue = sample.properties.PLASMIDS; - sample.properties.PLASMIDS_PARENTS = []; - - if (!xmlValueRegex.test(plasmidValue)) - return; - - globalValue = plasmidValue; - var plasmidXml = xmlParser.parseFromString(plasmidValue, "text/xml"); - - - for (i=1; i < plasmidXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = plasmidXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - if (sampleNode.attributes.getNamedItem("annotation") != null) { - var annotation = sampleNode.attributes.getNamedItem("annotation").value; - } - else{ - var annotation = ""; - } - if (sampleNode.attributes.getNamedItem("rel") != null) { - var relationship = sampleNode.attributes.getNamedItem("rel").value; - } - else{ - var relationship = ""; - } - } - - var PLASMIDS_PARENTS = null; - - if (relationship == "INT"){ - PLASMIDS_PARENTS = " " + code + "::" + annotation; - } - if (relationship == "MOD"){ - PLASMIDS_PARENTS = " " + code + "_" + annotation; - } - if (relationship == "DEL"){ - PLASMIDS_PARENTS = " " + code + "_D_" + annotation; - } - if (relationship == "") { - PLASMIDS_PARENTS = code; - } - - sample.properties.PLASMIDS_PARENTS.push(PLASMIDS_PARENTS); - -} - - - var yeastParentsValue = sample.properties.YEAST_PARENTS; - sample.properties.YEASTS_PARENTS = []; - - - if (!xmlValueRegex.test(yeastParentsValue)) - return; - - globalValue2 = yeastParentsValue; - var yeastParentsXml = xmlParser.parseFromString(yeastParentsValue, "text/xml"); - - for (i=1; i < yeastParentsXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleYeastNode = yeastParentsXml.childNodes.item(0).childNodes.item(i); - - var yeastsDisplay = null; - - if (sampleYeastNode.attributes.getNamedItem("code") != null ) { - var yeastCode = sampleYeastNode.attributes.getNamedItem("code").value; - } - - yeastsDisplay = yeastCode; - - sample.properties.YEASTS_PARENTS.push(yeastsDisplay); - - } - -}; - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = SAMPLE_TYPE_PROPERTIES - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEASTS_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - - } else { - yeast = yeastsById[objectOrId]; - - } - - - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - - - - - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - - - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }).enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - -var selection = d3.select("#vis").select("#sample-data-holder").selectAll("tr.yeast-table-data").data(yeasts); -// Code under enter is run if there is no HTML element for a data element - - selection - .enter() - .append("tr") - .attr("class", "yeast-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { - var tableFields = [sample.code]; - for(var i=0; i<SAMPLE_TYPE_PROPERTIES.length; i++) { - tableFields[tableFields.length] = sample.properties[SAMPLE_TYPE_PROPERTIES[i]]; - } - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - - -/** - * Filters - */ - - -function yeastFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - - - - -/** - * Function visualize filters - */ -function visualize(filterResults) -{ - var displayedYeasts; - - for(var i=0; i < SAMPLE_TYPE_PROPERTIES.length;i++) { - if(i == 0) { - displayedYeasts = yeasts.filter(yeastFilter.curry(((filterResults[i] == undefined)?"":filterResults[i]), SAMPLE_TYPE_PROPERTIES[i])); - } else { - displayedYeasts = displayedYeasts.filter(yeastFilter.curry((filterResults[i] == undefined)?"":filterResults[i],SAMPLE_TYPE_PROPERTIES[i])); - } - } - - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - -}; - - - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : SAMPLE_TYPE - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - //showChildrenSamples(); - populateMenuNew(); - createTableFromProperties(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - - - $('#search').keyup(function() { - visualize($('#search').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - - - - - - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Sample Template</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - - <div id="vis"> - <div id="tableContainer"></div> - </div> - - <div id="inspectorsContainer"></div> - </div> - </div> - - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/western_blotting-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/western_blotting-browser.html deleted file mode 100644 index 3723d772f12314d716e93f99a66105f2152fc686..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/western_blotting-browser.html +++ /dev/null @@ -1,1057 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -</head> - -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Western Blotting</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr class="western_blotting-table-header"><th>Code</th><th>Name</th><th>For What</th><th>Storage</th><th>Publication</th><th></th></tr> - </thead> - <tbody id='western_blotting-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> - -<script> - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - - - -// Some global variables we refer to - -/// All western_blotting -var western_blottings = null; - -/// The western_blotting that are currently being inspected -var inspectedwestern_blottings = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var chemicalValue = sample.properties.CHEMICALS; - sample.properties.CHEMICALS_PARENTS = []; - - if (!xmlValueRegex.test(chemicalValue)) - return; - - globalValue = chemicalValue; - var chemicalXml = xmlParser.parseFromString(chemicalValue, "text/xml"); - - - for (i=1; i < chemicalXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = chemicalXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var CHEMICALS_PARENTS = null; - - - CHEMICALS_PARENTS = "\n\n " +code + " (" + name + ") " + concentration ; - - - - sample.properties.CHEMICALS_PARENTS.push(CHEMICALS_PARENTS); - - - } -} - - - - var antibodyValue = sample.properties.ANTIBODIES; - sample.properties.ANTIBODY_PARENTS = []; - - if (!xmlValueRegex.test(antibodyValue)) - return; - - globalValue = antibodyValue; - var antibodyXml = xmlParser.parseFromString(antibodyValue, "text/xml"); - - - for (i=1; i < antibodyXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = antibodyXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var ANTIBODY_PARENTS = null; - - - ANTIBODY_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.ANTIBODY_PARENTS.push(ANTIBODY_PARENTS); - - - } - - -} - - - - var bufferValue = sample.properties.SOLUTIONS_BUFFERS; - sample.properties.SOLUTIONS_BUFFERS_PARENTS = []; - - if (!xmlValueRegex.test(bufferValue)) - return; - - globalValue = bufferValue; - var bufferXml = xmlParser.parseFromString(bufferValue, "text/xml"); - - - for (i=1; i < bufferXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = bufferXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - - if (sampleNode.attributes.getNamedItem("concentration") != null) { - var concentration = sampleNode.attributes.getNamedItem("concentration").value; - } - else{ - var concentration = "n.a."; - } - if (sampleNode.attributes.getNamedItem("name") != null) { - var name = sampleNode.attributes.getNamedItem("name").value; - } - else{ - var name = "n.a."; - } - } - - - - if (code !=null){ - - - var SOLUTIONS_BUFFERS_PARENTS = null; - - - SOLUTIONS_BUFFERS_PARENTS = "\n\n " +code + "(" + name + ")" + concentration ; - - - - sample.properties.SOLUTIONS_BUFFERS_PARENTS.push(SOLUTIONS_BUFFERS_PARENTS); - - - } - - -} - - - - - - -}; - -function reformatString(sample) -{ - - - sample.properties.WHAT_FOR = []; - console.log(sample.properties.FOR_WHAT) - - if (sample.properties.FOR_WHAT != "undefined") { - newArray = sample.properties.FOR_WHAT.split(/\d/); - for(i=0; i<newArray.length; i++) { - WHAT_FOR = i+' '+newArray[i]+ "\n"; - sample.properties.WHAT_FOR.push(WHAT_FOR) - - } - - console.log(sample.properties.WHAT_FOR) - //sample.properties.WHAT_FOR.push(sample.properties.WHAT_FOR) - } - - - -} - - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - - order1 = ["NAME", "FOR_WHAT", "SUPPLIER", "ARTICLE_NUMBER", "LOCAL_ID", "STORAGE", "STOCK_CONCENTRATION", "STERILIZATION", "MATERIALS", "ORGANISM", "KIT"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - - return new_list1; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - order2 = ["PROCEDURE", "PROTOCOL_EVALUATION","DETAILS", "EPITOPE", "CLONALITY", "ISOTYPE", "COMMENTS", "PUBLICATION" ] - - - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["CHEMICALS_PARENTS","ANTIBODY_PARENTS","SOLUTIONS_BUFFERS_PARENTS" ] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order4 = ["MEMBRANE","ANTIBODY_DILUTION","ANTIBODY_SOLUTION", "COMMENTS" ] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order5 = [ "XMLCOMMENTS","SUGGESTIONS", "PROTOCOL_MODIFICATIONS", "REGISTRATION_DATE"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - return new_list5; -} - - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - western_blotting = objectOrId; - } else { - western_blotting = western_blottingsById[objectOrId]; - } - - return western_blotting; -} - -function get_parents(data) -{ - - d = data.properties; - - new_list3=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list3.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list3; -} - - -function get_children(data) -{ - d = data.properties; - - new_list4=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list4.push([childLabel, child ]); - i++; - }); - - } - - return new_list4; -} - - -/** Initialize the western_blottings variable */ -function initializewestern_blottings(result) -{ - // Construct a map of all western_blottings by id - western_blottingsById = {}; - - // Split the western_blottings into two groups, the ones that start with FRP in their sample name and the other ones. - var frpwestern_blottings = [], otherwestern_blottings = []; - var frpRegex = /^FRWB[0-9]+/; - frpRegex.compile(frpRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - western_blottingsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the western_blottingsById map - theSample = western_blottingsById[sampleOrId]; - } - if (frpRegex.test(theSample.code)) { - frpwestern_blottings.push(theSample); - } else { - otherwestern_blottings.push(theSample); - } - initializeSyntheticProperties(theSample); - reformatString(theSample); - - }); - - // Sort each of the groups - otherwestern_blottings.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - frpwestern_blottings.sort(function(a, b) { - // Sort based on the FRP number - var frpNumberA = parseInt(a.code.substring(6)); - var frpNumberB = parseInt(b.code.substring(6)); - return (frpNumberA < frpNumberB) ? -1 : 1; - }); - - // Combine the two groups back together to produce the full collection of western_blottings - western_blottings = frpwestern_blottings.concat(otherwestern_blottings); -} - - - - -/** Set the size of the western_blotting-table based on whether or not inspectors are visible */ -function resizewestern_blottingTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 10; - cellWidth = "100%"; - areInspectorsVisible = true; - - var western_blottingTableTransition = d3.selectAll('div.western_blotting-table-data-cell'); - western_blottingTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectwestern_blotting(western_blotting) -{ - if (inspectedwestern_blottings.indexOf(western_blotting) < 0) { - inspectedwestern_blottings.push(western_blotting); - - // When requesting information about the sample, we don't need parents - // and children, so send a copy of the saple without that information. - var western_blottingToSend = $.extend({}, western_blotting); - delete western_blottingToSend.parents; - delete western_blottingToSend.children; - - } - resizewestern_blottingTable(); - updateInspectors(1000); -} - -function closeInspector(western_blotting) -{ - var index = inspectedwestern_blottings.indexOf(western_blotting); - if (index < 0) { - return; - } - - inspectedwestern_blottings.splice(index, 1); - resizewestern_blottingTable(); - updateInspectors(1000); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedwestern_blottings, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectwestern_blotting(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - .on("click", function(trData) { inspectwestern_blotting(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add table row for data sets - var dataSetRow = box.select("table.properties").append("tr"); - dataSetRow - .append("td") - .attr("class", "property") - .text("DATA_SETS"); - dataSetRow - .append("td") - .attr("class", "data_sets"); - -} - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializewestern_blottings(data.result); - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - if (western_blottings.length < 1) { - vis.append("p").text("No data found."); - return; - } - - var selection = d3.select("#vis").select("#western_blotting-table").selectAll("tr.western_blotting-table-data").data(western_blottings); - // Code under enter is run if there is no HTML element for a data element - - - - selection - .enter() - .append("tr") - .attr("class", "western_blotting-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectwestern_blotting) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.NAME, sample.properties.WHAT_FOR, sample.properties.STORAGE, sample.properties.PUBLICATION]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - - }) - .enter() - .append("td") - .append("div") - .attr("class", "western_blotting-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); -} - -function western_blottingFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - -function visualize(ownerFilterText, ownerNumFilterText, antibodyNameFilterText, backboneFilterText, antibioticFilterText, markerFilterText ) -{ - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (antibodyNameFilterText == undefined) - { - antibodyNameFilterText = ""; - } - - if (backboneFilterText == undefined) - { - backboneFilterText = ""; - } - - if (antibioticFilterText == undefined) - { - antibioticFilterText = ""; - } - - if (markerFilterText == undefined) - { - markerFilterText = ""; - } - - var displayedAntibodys = antibodys.filter(antibodyFilter.curry(ownerFilterText, "OWNER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibodyNameFilterText, "ANTIBODY_NAME")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(backboneFilterText, "BACKBONE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(antibioticFilterText, "BACTERIAL_ANTIBIOTIC_RESISTANCE")); - displayedAntibodys = displayedAntibodys.filter(antibodyFilter.curry(markerFilterText, "YEAST_MARKER")); - - - - var selection2 = d3.select("#vis").select("#western_blotting-table").selectAll("tr.western_blotting-table-data").data(western_blottings); - // Code under enter is run if there is no HTML element for a data element - - - - selection2.style("display", - function(data) { - if ($.inArray(data, displayedwestern_blottings) != -1) { - return "table-row" - } else { - return "none" - } - }); - - -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "WESTERN_BLOTTING" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - console.log(data); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibodyName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#backbone_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#antibiotic_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - $('#marker_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#antibodyName_filter').val(), $('#backbone_filter').val(), $('#antibiotic_filter').val(), $('#marker_filter').val()); - }); - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} -</script> - - - -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/yeast-browser.html b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/yeast-browser.html deleted file mode 100644 index a022963db01e6fc6632bbdbf423fba9a49a14c35..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/html/yeast-browser.html +++ /dev/null @@ -1,1024 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> - <title>YeastLab Browser</title> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap.css" /> - <link type="text/css" rel="stylesheet" href="./bootstrap/css/bootstrap-responsive.css" /> - <link type="text/css" rel="stylesheet" href="./css/style.css" /> - - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-login.js"></script> - <!-- <script To speed development, cache the requests type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script type="text/javascript" src="./js/d3.js"></script> - <script type="text/javascript" src="./js/d3.layout.js"></script> - <script type="text/javascript" src="./js/d3.time.js"></script> - <script type="text/javascript" src="./js/d3.tsv.js"></script> - <script type="text/javascript" src="./js/infra.js"></script> - <script type="text/javascript" src="./js/jquery.dataTables.js"></script> - <script type="text/javascript" src="./js/common.js"></script> - -<script> - - -/// The openbisServer we use for our data -openbisServer = new openbis(openbisUrl, dssUrl); - - -// Some global variables we refer to - -/// All yeasts -var yeasts = null; - -/// The yeasts that are currently being inspected -var inspectedYeasts = []; - -/// The width of the inspectors section -var inspectorsWidth = 450; - -//var appWidth = 200; - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 30); -} - -function getAppWidth(){ - return $(window).width(); -} - - -var didCreateVis = false; - -/// The visualization, referenced by functions that display content -var vis; - -/// The inspectors, referenced by functions that show or hide inspectors -var inspectors; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#vis"); - - // An element for the inspectors. - inspectors = d3.select("#inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("overflow", "auto") - .style("display", "none"); - - didCreateVis = true; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - - - -xmlValueRegex = /^<root>.*/; -xmlValueRegex.compile(xmlValueRegex); -xmlParser = new DOMParser(); - -/** Initialize properties that are not stored in the database */ -function initializeSyntheticProperties(sample) -{ - var plasmidValue = sample.properties.PLASMIDS; - sample.properties.PLASMIDS_PARENTS = []; - - if (!xmlValueRegex.test(plasmidValue)) - return; - - globalValue = plasmidValue; - var plasmidXml = xmlParser.parseFromString(plasmidValue, "text/xml"); - - - for (i=1; i < plasmidXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleNode = plasmidXml.childNodes.item(0).childNodes.item(i); - - if (sampleNode.attributes.getNamedItem("code") != null) { - - var code = sampleNode.attributes.getNamedItem("code").value; - - if (sampleNode.attributes.getNamedItem("annotation") != null) { - var annotation = sampleNode.attributes.getNamedItem("annotation").value; - } - else{ - var annotation = ""; - } - if (sampleNode.attributes.getNamedItem("rel") != null) { - var relationship = sampleNode.attributes.getNamedItem("rel").value; - } - else{ - var relationship = ""; - } - } - - var PLASMIDS_PARENTS = null; - - if (relationship == "INT"){ - PLASMIDS_PARENTS = " " + code + "::" + annotation; - } - if (relationship == "MOD"){ - PLASMIDS_PARENTS = " " + code + "_" + annotation; - } - if (relationship == "DEL"){ - PLASMIDS_PARENTS = " " + code + "_D_" + annotation; - } - if (relationship == "") { - PLASMIDS_PARENTS = code; - } - - sample.properties.PLASMIDS_PARENTS.push(PLASMIDS_PARENTS); - -} - - - var yeastParentsValue = sample.properties.YEAST_PARENTS; - sample.properties.YEASTS_PARENTS = []; - - - if (!xmlValueRegex.test(yeastParentsValue)) - return; - - globalValue2 = yeastParentsValue; - var yeastParentsXml = xmlParser.parseFromString(yeastParentsValue, "text/xml"); - - for (i=1; i < yeastParentsXml.childNodes.item(0).childNodes.length; i+=2 ) { - - var sampleYeastNode = yeastParentsXml.childNodes.item(0).childNodes.item(i); - - var yeastsDisplay = null; - - if (sampleYeastNode.attributes.getNamedItem("code") != null ) { - var yeastCode = sampleYeastNode.attributes.getNamedItem("code").value; - } - - yeastsDisplay = yeastCode; - - sample.properties.YEASTS_PARENTS.push(yeastsDisplay); - - } - -}; - - -/** - * Convert properties to pairs - */ -function props_to_pairs1(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order1 = ["OWNER", "OWNER_NUMBER", "YEAST_STRAIN_NAME", "COMMENTS", "PROJECT", "PLASMIDS_PARENTS", "PLASMID_NAME", "BACKBONE", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS"] - new_list1 = [] - for (var i in order1) { - for (var j in pairs) { - if (pairs[j][0] == order1[i]) { - new_list1.push(pairs[j]); - break; - } - } - } - return new_list1; -} - - -function props_to_pairs5(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order5 = ["YEASTS_PARENTS"] - new_list5 = [] - for (var i in order5) { - for (var j in pairs) { - if (pairs[j][0] == order5[i]) { - new_list5.push(pairs[j]); - break; - } - } - } - - return new_list5; -} - - -function props_to_pairs2(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - - order2 = ["GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKERS", "COMMON_MARKERS", "ENDOGENOUS_PLASMID"] - new_list2 = [] - for (var i in order2) { - for (var j in pairs) { - if (pairs[j][0] == order2[i]) { - new_list2.push(pairs[j]); - break; - } - } - } - return new_list2; -} - -function props_to_pairs3(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - order3 = ["SOURCE","ORIGIN","STRAIN_CHECK"] - new_list3 = [] - for (var i in order3) { - for (var j in pairs) { - if (pairs[j][0] == order3[i]) { - new_list3.push(pairs[j]); - break; - } - } - } - return new_list3; -} - -function props_to_pairs4(data) -{ - - d = data.properties; - - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - - pairs.push(["REGISTRATION_DATE", new Date(data.registrationDetails.registrationDate)]); - - order4 = [ "BOX_NUMBER","ROW","COLUMN","REGISTRATION_DATE"] - new_list4 = [] - for (var i in order4) { - for (var j in pairs) { - if (pairs[j][0] == order4[i]) { - new_list4.push(pairs[j]); - break; - } - } - } - return new_list4; -} - - -function resolveObjectReference(objectOrId) { - if (isNaN(objectOrId)) { - yeast = objectOrId; - - } else { - yeast = yeastsById[objectOrId]; - - } - - - return yeast; -} - - - -function get_parents(data) -{ - - d = data.properties; - - new_list5=[] - - if (data.parents != null) { - var i = 1; - data.parents.forEach(function(parentOrId) { - parentLabel = "PARENT "+ i; - parent = resolveObjectReference(parentOrId); - new_list5.push([parentLabel, parent ]); - i++; - }); - - } - - return new_list5; -} - - -function get_children(data) -{ - d = data.properties; - - new_list6=[] - - if (data.children != null) { - var i = 1; - data.children.forEach(function(childOrId) { - childLabel = "CHILD "+ i; - child = resolveObjectReference(childOrId); - new_list6.push([childLabel, child ]); - i++; - }); - - } - - return new_list6; -} - - - - - - - -/** Initialize the yeasts variable */ -function initializeYeasts(result) -{ - // Split the yeasts into two groups, the ones that start with FRY in their sample name and the other ones. - // Construct a map of all yeasts by id - yeastsById = {}; - - // Split the yeasts into two groups, the ones that start with FRP in their sample name and the other ones. - var fryYeasts = [], otherYeasts = []; - var fryRegex = /^FRY[0-9]+/; - fryRegex.compile(fryRegex); - result.forEach(function(sampleOrId) { - var theSample = sampleOrId; - function storeSamplesById(referredSample) { - if (isNaN(referredSample)) { - yeastsById[referredSample["@id"]] = referredSample; - if (referredSample.parents) referredSample.parents.forEach(storeSamplesById); - if (referredSample.children) referredSample.children.forEach(storeSamplesById); - } - } - if (isNaN(theSample)) { - storeSamplesById(theSample); - } else { - // This is referring to an object in the yeastsById map - theSample = yeastsById[sampleOrId]; - } - if (fryRegex.test(theSample.code)) { - fryYeasts.push(theSample); - } else { - otherYeasts.push(theSample); - } - initializeSyntheticProperties(theSample); - }); - - // Sort each of the groups - otherYeasts.sort(function(a, b) { - return (a.code < b.code) ? -1 : 1; - }); - - fryYeasts.sort(function(a, b) { - // Sort based on the FRY number - var fryNumberA = parseInt(a.code.substring(3)); - var fryNumberB = parseInt(b.code.substring(3)); - return (fryNumberA < fryNumberB) ? -1 : 1; - }); - - - - - // Combine the two groups back together to produce the full collection of yeasts - yeasts = fryYeasts.concat(otherYeasts); -} - - - -/** Set the size of the yeast-table based on whether or not inspectors are visible */ -function resizeYeastTable() -{ - var cellWidth; - var areInspectorsVisible; - var padding = 20; - cellWidth = "100%"; - areInspectorsVisible = true; - - var yeastTableTransition = d3.selectAll('div.yeast-table-data-cell'); - yeastTableTransition.style('width', cellWidth); - if (areInspectorsVisible) { - $("#inspectorsContainer").show(); - } else { - $("#inspectorsContainer").hide(); - } -} - -function inspectYeast(yeast) -{ - if (null == yeast) { - // Ignore this -- it is not a yeast - return; - } - - if (inspectedYeasts.indexOf(yeast) < 0) { - inspectedYeasts.push(yeast); - } - resizeYeastTable(); - updateInspectors(1000); -} - -function closeInspector(yeast) -{ - var index = inspectedYeasts.indexOf(yeast); - if (index < 0) { - return; - } - - inspectedYeasts.splice(index, 1); - resizeYeastTable(); - updateInspectors(1000); -} - - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspectedYeasts, function (d) { return d.code }); - - var box = inspector - .enter() - .append("div") - .attr("class", "inspector") - .attr("id", function(d) {return d.code+"_INSPECTOR"}) - .text(function(d) { return d.code }); - - box.append("span") - .attr("class", "close") - .on("click", closeInspector) - .text("x"); - - inspector - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs1(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable5 = box.append("table").attr("class", "properties"); - propsTable5.selectAll("tr").data(function(d) { return props_to_pairs5(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTableParents = box.append("table").attr("class", "properties"); - propsTableParents.selectAll("tr").data(function(d) { return get_parents(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - - - var propsTableChildren = box.append("table").attr("class", "properties"); - propsTableChildren.selectAll("tr").data(function(d) { return get_children(d) }) - .enter() - .append("tr") - //.on("click", inspectYeast) - .on("click", function(trData) { inspectYeast(trData[1]) } ) - .style("cursor", "pointer") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { - if (null == d.identifier) { - return d; - } else { - return d.identifier.slice(11,50); - } - }) - .transition() - .duration(duration) - .style("opacity", "1"); - - var propsTable2 = box.append("table").attr("class", "properties"); - propsTable2.selectAll("tr").data(function(d) { return props_to_pairs2(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable3 = box.append("table").attr("class", "properties"); - propsTable3.selectAll("tr").data(function(d) { return props_to_pairs3(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - var propsTable4 = box.append("table").attr("class", "properties"); - propsTable4.selectAll("tr").data(function(d) { return props_to_pairs4(d) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .duration(duration) - .style("opacity", "1"); - - - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - - -} - - - -/** - * Display the samples returned by the server - */ -function displayReturnedSamples(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - initializeYeasts(data.result); - -// This will show the object in the log -- helpful for debugging -// console.log(data.result); - if (yeasts.length < 1) { - vis.append("p").text("No data found."); - return; - } - - - - var selection = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - -selection - .enter() - .append("tr") - .attr("class", "yeast-table-data") - .attr("permId", function(sample){ return sample.permId }) - .style("cursor", "pointer") - .on("click", inspectYeast) - .selectAll("td").data(function(sample) { - tableFields = [sample.identifier.slice(11,50), sample.properties.OWNER.split('_').join(" "), sample.properties.OWNER_NUMBER, sample.properties.YEAST_STRAIN_NAME, sample.properties.PROJECT, sample.properties.PLASMIDS_PARENTS, sample.properties.YEASTS_PARENTS, sample.properties.GENETIC_BACKGROUND, sample.properties.MATING_TYPE]; - tableFields[tableFields.length] = "<center><a class='btn' onclick=\"jsfunction\" href=\"javascript:showEditWindowForSample('"+sample.code+"', '"+sample.permId+"');\">Edit</a></center>"; - return tableFields; - }) - .enter() - .append("td") - .append("div") - .attr("class", "yeast-table-data-cell") - .html(String) - - $('a').click(function(e){ - e.stopPropagation(); - }); - -} - - -/** - * Filters - */ - - -function yeastFilter(filter, property, element, index, array) { - - - filter = filter.toLowerCase(); - if (filter.length < 1) return true; - - if (property == "CODE") { - if (element.code.toLowerCase().indexOf(filter) != -1) { - return true; - } - } - - if (element.properties[property] == undefined) { - return false; - } - - if (element.properties[property].toLowerCase().indexOf(filter) != -1) { - return true; - } - - return false; -} - - - - - -/** - * Function visualize filters - */ -function visualize(ownerFilterText, ownerNumFilterText, yeastNameFilterText, projectFilterText, plasmidsFilterText, yeastParentsFilterText, geneticBackgroundFilterText, matingTypeFilterText ) -{ - - - if (ownerFilterText == undefined) - { - ownerFilterText = ""; - } - - if (ownerNumFilterText == undefined) - { - ownerNumFilterText = ""; - } - - if (yeastNameFilterText == undefined) - { - yeastNameFilterText = ""; - } - - if (projectFilterText == undefined) - { - projectFilterText = ""; - } - - if (plasmidsFilterText == undefined) - { - plasmidsFilterText = ""; - } - - if (yeastParentsFilterText == undefined) - { - yeastParentsFilterText = ""; - } - - if (geneticBackgroundFilterText == undefined) - { - geneticBackgroundFilterText = ""; - } - - if (matingTypeFilterText == undefined) - { - matingTypeFilterText = ""; - } - - var displayedYeasts = yeasts.filter(yeastFilter.curry(ownerFilterText, "OWNER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(ownerNumFilterText, "OWNER_NUMBER")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastNameFilterText, "YEAST_STRAIN_NAME")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(projectFilterText, "PROJECT")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(plasmidsFilterText, "PLASMIDS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(yeastParentsFilterText, "YEAST_PARENTS")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(geneticBackgroundFilterText, "GENETIC_BACKGROUND")); - displayedYeasts = displayedYeasts.filter(yeastFilter.curry(matingTypeFilterText, "MATING_TYPE")); - - - var selection2 = d3.select("#vis").select("#yeast-table").selectAll("tr.yeast-table-data").data(yeasts); - // Code under enter is run if there is no HTML element for a data element - - - selection2.style("display", function(data) { - if ($.inArray(data, displayedYeasts) != -1) { - return "table-row" - } - else { - return "none" - } - }); - - -}; - - - - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ - - - - - - -function showMatchingSamples() -{ - var matchClauses = [ {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "TYPE", - desiredValue : "YEAST" - } - ] - - var selectedYeastCode = new openbisWebAppContext().getParameter('code'); - if(selectedYeastCode){ - matchClauses.push( - {"@type":"AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : selectedYeastCode - } - ); - } - - var sampleCriteria = - { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], displayReturnedSamples); - -} - - - -/** - * Login - */ -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - createVis(); - - //showChildrenSamples(); - - populateMenuNew(); - - showMatchingSamples(); -} - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - $('#owner_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#ownerNum_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastName_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#project_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#plasmids_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#yeastParents_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#geneticBackground_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#matingType_filter').keyup(function() { - visualize($('#owner_filter').val(), $('#ownerNum_filter').val(), $('#yeastName_filter').val(), $('#project_filter').val(), $('#plasmids_filter').val(), $('#yeastParents_filter').val(), $('#geneticBackground_filter').val(), $('#matingType_filter').val()); - }); - - $('#search').keyup(function() { - visualize($('#search').val()); - }); - - - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - -// Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -/** - * Show and Hide the filters when clicking on the Filters button - */ -function ShowHide(divId) -{ - if(document.getElementById(divId).style.display == 'none') - { - document.getElementById(divId).style.display='block'; - } - else - { - document.getElementById(divId).style.display = 'none'; - } -} - - -</script> - -</head> -<body> - <div> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; margin-left: 10px; margin-top: 10px; width: 120px;"/> - </div> - - <div id="login-form-div" style="visibility:hidden; margin-top: 10px; auto; margin-left: auto; margin-right: auto; display: block; background-color: #EEEEEE; border-radius: 6px 6px 6px 6px; width: 400px; padding: 20px;"> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" /> - <br /><br /> - <form id="login-form" action="javascript:"> - <input placeholder="username" id="username" type="text" required="required"> - <br /> - <input placeholder="password" id="password" type="password" required="required"> - <br /> - <button class="btn" id="login-button" type="submit">Login</button> - <br /><br /> - <center> - Compatible With: - <br /> - <img src="./images/browser-icon-chrome.png" style="width: 96px; height:96px;" /><img src="./images/browser-icon-firefox.png" style="width: 96px; height:96px;" /> - </center> - </form> - </div> - - <div id="main"> - <center> - <h1 id = "title" style="padding-top:20px">Yeasts</h1> - </center> - - <div class="container-fluid"> - <div class="row-fluid"> - <div class="span2" id ="sectionsContainer"></div> - <div class="span10"> - <div id="vis"> - <div style="height: 500px; width:100%; overflow: auto;"> - <table class="table table-striped table-bordered table-hover"> - <thead> - <tr> - <td></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Owner filter" id="owner_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Owner Num filter" id="ownerNum_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Yeast Name filter" id="yeastName_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Project filter" id="project_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Plastmids filter" id="plasmids_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Yeast Parents filter" id="yeastParents_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Genetic Background filter" id="geneticBackground_filter" type="text"></td> - <td style="border:none; border-collapse:collapse;"><input style="width: 90%;" placeholder="Mating filter" id="matingType_filter" type="text"></td> - </tr> - <tr class="yeast-table-header"><th>Code</th><th>Owner</th><th>Owner Number</th><th>Yeast Strain Name</th><th>Project</th><th>Plasmids</th><th>Yeast Parents</th><th>Genetic Background</th><th>Mating Type</th><th></th></tr> - </thead> - <tbody id='yeast-table'></tbody> - </table> - </div> - </div> - <div id="inspectorsContainer"></div> - </div> - </div> - </div> - </div> -</body> -</html> diff --git a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/plugin.properties b/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/plugin.properties deleted file mode 100644 index 9a94ff03bf056593809e33328f4b5346335829e1..0000000000000000000000000000000000000000 --- a/plasmid/source/core-plugins/yeastlabbrowser/2/as/webapps/yeastlabbrowser/plugin.properties +++ /dev/null @@ -1 +0,0 @@ -webapp-folder = html diff --git a/plasmid/source/drop-boxes/BOXIT-integration/import_antibody.py b/plasmid/source/drop-boxes/BOXIT-integration/import_antibody.py deleted file mode 100644 index 2a0d114d57e360a31c639b9ca2cf13125c6496e1..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/BOXIT-integration/import_antibody.py +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env python - - -import sys, csv, os, re -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType -from datetime import datetime - -print "########################################################" - -SPACE_CODE = "INVENTORY" -PROJECT_CODE = "MATERIALS" -PROJECT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s" % vars() -EXPERIMENT_CODE = "ANTIBODY" -EXPERIMENT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s/%(EXPERIMENT_CODE)s" % vars() - -# A map that has the sample property codes as the key and the CSV header as the value -CSV_TO_PROPERTY_MAPPING = { - # PROPERTY_CODE : (CSV_HEADER, FORMAT) - 'NAME' : ('Antibody ID', DataType.VARCHAR), - 'ANTIBODY_ID_NR': ('antibody_id_nr', DataType.VARCHAR), - 'ANTIGEN ': ('antigen', DataType.VARCHAR), - 'BARCODE' : ('barcode', DataType.VARCHAR), - 'BARCODE_LABEL' : ('barcode', DataType.VARCHAR), - 'ANTIBODY_FACS_BLOCK' : ('block facs', DataType.VARCHAR), - 'ANTIBODY_IF_BLOCK' : ('block IFF', DataType.VARCHAR), - 'ANTIBODY_WB_BLOCK' : ('block western', DataType.VARCHAR), - 'BOX' : ('box', DataType.VARCHAR), - 'CATALOGUE_NUMBER' : ('catalog id #', DataType.VARCHAR), - 'CLASS' : ('class', DataType.VARCHAR), - 'CLONE' : ('clone', DataType.VARCHAR), - 'ANTIBODY_FACS_CONC' : ('conc facs', DataType.VARCHAR), - 'ANTIBODY_IF_CONC' : ('conc IFF', DataType.VARCHAR), - 'ANTIBODY_IP_CONC' : ('conc ip', DataType.VARCHAR), - 'ANTIBODY_WB_CONC' : ('ANTIBODY_WB_CONC', DataType.VARCHAR), - 'ANTIBODY_CONCENTRATION' : ('concentration', DataType.VARCHAR), - 'ANTIBODY_CROSSREACTIVITY' : ('crossreactivity', DataType.VARCHAR), - 'ANTIBODY_FACS_FIX' : ('fix facs', DataType.VARCHAR), - 'ANTIBODY_IF_FIX' : ('fix IFF', DataType.VARCHAR), - 'ANTIBODY_WB_FIX' : ('fix western', DataType.VARCHAR), - 'COMMENTS' : ('info', DataType.VARCHAR), - 'LOTNUMBER' : ('lotnumber', DataType.VARCHAR), - 'MODIFIED_BY': ('modified by', DataType.VARCHAR), - 'ANTIBODY_FACS_NOTES' : ('notes FACS', DataType.VARCHAR), - 'ANTIBODY_IF_NOTES' : ('notes IFF', DataType.VARCHAR), - 'ANTIBODY_IP_NOTES': ('notes IP', DataType.VARCHAR), - 'ANTIBODY_WB_NOTES' : ('notes western', DataType.VARCHAR), - 'RACK' : ('rack', DataType.VARCHAR), - 'PUBLISHED' : ('reference', DataType.VARCHAR), - 'SERIAL_NUMBER' : ('serial number', DataType.INTEGER), - 'ANTIGEN_SIZE' : ('size', DataType.VARCHAR), - 'BOX_NUMBER' : ('antibody ID data box::box label', DataType.VARCHAR), - 'FROZEN_BY' : ('antibody ID data box::frozen by', DataType.VARCHAR), - 'FREEZER_NAME' : ('antibody ID data box::location', DataType.CONTROLLEDVOCABULARY), - 'BOX_POSITION': ('antibody ID data box::position', DataType.VARCHAR), - -} - -#create a space if it does not exist -def create_space_if_needed(tr): - space = tr.getSpace(SPACE_CODE) - if None == space: - space = tr.createNewSpace(SPACE_CODE, None) - space.setDescription("Inventory space") - -#create a project if it does not exist -def create_project_if_needed(tr): - project = tr.getProject(PROJECT_ID) - if None == project: - create_space_if_needed(tr) - project = tr.createNewProject(PROJECT_ID) - project.setDescription("Materials purchased or produced in the lab") - -#create an experiment if it does not exist -def create_experiment_if_needed(tr): - """ Get the specified experiment or register it if necessary """ - exp = tr.getExperiment(EXPERIMENT_ID) - if None == exp: - create_project_if_needed(tr) - exp = tr.createNewExperiment(EXPERIMENT_ID, 'DEFAULT_EXPERIMENT') - - return exp - -#parse the csv file exported form Filemaker -def parse_incoming(tr,exp): - data_rows = [] - f = open(tr.getIncoming().getAbsolutePath(), 'rU') - dialect = csv.Sniffer().sniff(f.read()) - f.seek(0) - reader = csv.DictReader(f, dialect = dialect) - - ## - ## 0. Current sample and storage properties being used - ## - storageProperties = [{ - "FREEZER_NAME" : "FREEZER_NAME", - "ROW" : "ROW", - "COLUMN" : "COLUMN", - "BOX_NUMBER" : "BOX_NUMBER", - "BOX_POSITION" : "BOX_POSITION", - "USER_ID" : "USER_PROPERTY" - }, { - "FREEZER_NAME" : "FREEZER_NAME_2", - "ROW" : "ROW_2", - "COLUMN" : "COLUMN_2", - "BOX_NUMBER" : "BOX_NUMBER_2", - "BOX_POSITION" : "BOX_POSITION_2", - "USER_ID" : "USER_PROPERTY_2" - }, { - "FREEZER_NAME" : "FREEZER_NAME_3", - "ROW" : "ROW_3", - "COLUMN" : "COLUMN_3", - "BOX_NUMBER" : "BOX_NUMBER_3", - "BOX_POSITION" : "BOX_POSITION_3", - "USER_ID" : "USER_PROPERTY_3" - }, { - "FREEZER_NAME" : "FREEZER_NAME_4", - "ROW" : "ROW_4", - "COLUMN" : "COLUMN_4", - "BOX_NUMBER" : "BOX_NUMBER_4", - "BOX_POSITION" : "BOX_POSITION_4", - "USER_ID" : "USER_PROPERTY_4" - }, { - "FREEZER_NAME" : "FREEZER_NAME_5", - "ROW" : "ROW_5", - "COLUMN" : "COLUMN_5", - "BOX_NUMBER" : "BOX_NUMBER_5", - "BOX_POSITION" : "BOX_POSITION_5", - "USER_ID" : "USER_PROPERTY_5" - }, { - "FREEZER_NAME" : "FREEZER_NAME_6", - "ROW" : "ROW_6", - "COLUMN" : "COLUMN_6", - "BOX_NUMBER" : "BOX_NUMBER_6", - "BOX_POSITION" : "BOX_POSITION_6", - "USER_ID" : "USER_PROPERTY_6" - }, { - "FREEZER_NAME" : "FREEZER_NAME_7", - "ROW" : "ROW_7", - "COLUMN" : "COLUMN_7", - "BOX_NUMBER" : "BOX_NUMBER_7", - "BOX_POSITION" : "BOX_POSITION_7", - "USER_ID" : "USER_PROPERTY_7" - }, { - "FREEZER_NAME" : "FREEZER_NAME_8", - "ROW" : "ROW_8", - "COLUMN" : "COLUMN_8", - "BOX_NUMBER" : "BOX_NUMBER_8", - "BOX_POSITION" : "BOX_POSITION_8", - "USER_ID" : "USER_PROPERTY_8" - }, { - "FREEZER_NAME" : "FREEZER_NAME_9", - "ROW" : "ROW_9", - "COLUMN" : "COLUMN_9", - "BOX_NUMBER" : "BOX_NUMBER_9", - "BOX_POSITION" : "BOX_POSITION_9", - "USER_ID" : "USER_PROPERTY_9" - }, { - "FREEZER_NAME" : "FREEZER_NAME_10", - "ROW" : "ROW_10", - "COLUMN" : "COLUMN_10", - "BOX_NUMBER" : "BOX_NUMBER_10", - "BOX_POSITION" : "BOX_POSITION_10", - "USER_ID" : "USER_PROPERTY_10" - } - ]; - - - currentSample = None - storagePropertiesIndex = 0 - - for row in reader: - ## - ## 1. Check if there is an entity with all information or only new storage data - ## - onlyStorage = None - - space_code = SPACE_CODE - sample_code = row.get('ANTIBODY_ID_NR') - sample_id = "/%(space_code)s/%(sample_code)s" % vars() - - if sample_code != None and sample_code != '': - storagePropertiesIndex = 0 - onlyStorage = False - else: - onlyStorage = True - storagePropertiesIndex += 1 - - - ## - ## 2. Depending on the outcome you set all fields or only new storage fields - ## - if not onlyStorage: - # 1. Set all properties - - currentSample = tr.getSample(sample_id) - if not currentSample: - currentSample = tr.createNewSample(sample_id, 'ANTIBODY') - currentSample.setExperiment(exp) - - for key in CSV_TO_PROPERTY_MAPPING: - prop_value = row[CSV_TO_PROPERTY_MAPPING[key][0]] - if prop_value == '' or prop_value == None: - prop_value = 'n.a.' - currentSample.setPropertyValue(CSV_TO_PROPERTY_MAPPING[key][0],prop_value) - - else: - # 2. Set always the storage properties - - - freezer_name_label =storageProperties[storagePropertiesIndex]['FREEZER_NAME'] - freezer_name_value =row[CSV_TO_PROPERTY_MAPPING['FREEZER_NAME'][0]] - box_number_label =storageProperties[storagePropertiesIndex]['BOX_NUMBER'] - box_number_value =row[CSV_TO_PROPERTY_MAPPING['BOX_NUMBER'][0]] - box_position_label = storageProperties[storagePropertiesIndex]['BOX_POSITION'] - box_position_value = row[CSV_TO_PROPERTY_MAPPING['BOX_POSITION'][0]] - - # row_label =storageProperties[storagePropertiesIndex]['ROW'] - # row_value =row[CSV_TO_PROPERTY_MAPPING['ROW'][0]] - # column_label =storageProperties[storagePropertiesIndex]['COLUMN'] - # column_value =row[CSV_TO_PROPERTY_MAPPING['COLUMN'][0]] - # user_id_label =storageProperties[storagePropertiesIndex]['USER_ID'] - # user_id_value = row[CSV_TO_PROPERTY_MAPPING['USER_ID'][0]] - - - currentSample.setPropertyValue(freezer_name_label, freezer_name_value) - currentSample.setPropertyValue(box_number_label, box_number_value) - currentSample.setPropertyValue(box_position_label, box_position_value) - #currentSample.setPropertyValue(row_label, row_value) - # currentSample.setPropertyValue(column_label, column_value) - # currentSample.setPropertyValue(user_id_label, user_id_value) - - - f.close() - return data_rows - - -def process(tr): - exp = create_experiment_if_needed(tr) - data_rows = parse_incoming(tr,exp) - - - - - diff --git a/plasmid/source/drop-boxes/facs_data/BDLSRFortessaDropbox.py b/plasmid/source/drop-boxes/facs_data/BDLSRFortessaDropbox.py deleted file mode 100644 index 57ffbe2b18e7d9c26ed82d99ed5c366935154649..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/facs_data/BDLSRFortessaDropbox.py +++ /dev/null @@ -1,589 +0,0 @@ -""" -@author: Aaron Ponti -""" -import re -import os -import logging -import xml.etree.ElementTree as xml -from datetime import datetime - -class Processor: - """The Processor class performs all steps required for registering datasets - from the assigned dropbox folder.""" - - # A transaction object passed by openBIS - transaction = None - - # The incoming folder to process (a java.io.File object) - incoming = "" - - # Constructor - def __init__(self, transaction, logFile): - - self.transaction = transaction - self.incoming = transaction.getIncoming() - - # Set up logging - logging.basicConfig(filename=logFile, level=logging.DEBUG) - - def createExperiment(self, expId, expName, - expType="LSR_FORTESSA_EXPERIMENT"): - """Create an experiment with given Experiment ID extended with the addition - of a string composed from current date and time. - - @param expID, the experiment ID - @param expName, the experiment name - @param expType, the experiment type that must already exist; optional, - default is "LSR_FORTESSA_EXPERIMENT" - """ - - # Make sure to keep the code length within the limits imposed by - # openBIS for codes - if len(expId) > 41: - expId = expId[0:41] - - # Create univocal ID - expId = expId + "_" + self.getCustomTimeStamp() - - # Create the experiment - logging.info("Register experiment %s" % expId) - exp = self.transaction.createNewExperiment(expId, expType) - if not exp: - msg = "Could not create experiment " + expId + "!" - logging.error(msg) - raise Exception(msg) - else: - logging.info("Created experiment with ID " + expId + ".") - - # Store the name - exp.setPropertyValue("LSR_FORTESSA_EXPERIMENT_NAME", expName) - - return exp - - def createSampleWithGenCode(self, spaceCode, - sampleType="LSR_FORTESSA_PLATE"): - """Create a sample with automatically generated code. - - @param spaceCode, the code of the space - @param sampleType, the sample type that must already exist - @return sample An ISample - """ - - # Make sure there are not slashes in the spaceCode - spaceCode = spaceCode.replace("/", "") - - # Create the sample - sample = self.transaction.createNewSampleWithGeneratedCode(spaceCode, sampleType) - if not sample: - msg = "Could not create sample with generated code" - logging.error(msg) - raise Exception(msg) - - return sample - - def formatExpDateForPostgreSQL(self, expDate): - """Format the experiment date to be compatible with postgreSQL's - 'timestamp' data type - - @param Date stored in the FCS file, in the form 01-JAN-2013 - @return Date in the form 2013-01-01 - """ - - monthMapper = {'JAN': '01', 'FEB': '02', 'MAR': '03', 'APR': '04', - 'MAY': '05', 'JUN': '06', 'JUL': '07', 'AUG': '08', - 'SEP': '09', 'OCT': '10', 'NOV': '11', 'DEC': '12'} - - # Separate the date into day, month, and year - (day, month, year) = expDate.split("-") - - # Try mapping the month to digits (e.g. "06"). If the mapping does - # not work, return "NOT_FOUND" - month = monthMapper.get(month, "NOT_FOUND") - - # Build the date in the correct format. If the month was not found, - # return 01-01-1970 - if (month == "NOT_FOUND"): - logging.info("Invalid experiment date %s found. " \ - "Reverting to 1970/01/01." % expDate) - return "1970-01-01" - else: - return (year + "-" + month + "-" + day) - - def getCustomTimeStamp(self): - """Create an univocal time stamp based on the current date and time - (works around incomplete API of Jython 2.5). - """ - - t = datetime.now() - return (t.strftime("%y%d%m%H%M%S") + unicode(t)[20:]) - - def getSubFolders(self): - """Returns a list of subfolders of the passed incoming directory. - - @return list of subfolders (String) - """ - - incomingStr = self.incoming.getAbsolutePath() - return [name for name in os.listdir(incomingStr) - if os.path.isdir(os.path.join(incomingStr, name))] - - def processExperiment(self, experimentNode, - openBISExpType="LSR_FORTESSA_EXPERIMENT"): - """Register an IExperimentUpdatable based on the Experiment XML node. - - @param experimentNode An XML node corresponding to an Experiment - @param openBISExpType The experiment type - @return IExperimentUpdatable experiment - """ - - # Get the openBIS identifier - openBISIdentifier = experimentNode.attrib.get("openBISIdentifier") - - # Get the experiment name - expName = experimentNode.attrib.get("name") - - # Get the experiment date and reformat it to be compatible - # with postgreSQL - expDate = self.formatExpDateForPostgreSQL(experimentNode.attrib.get("date")) - - # Get the description - description = experimentNode.attrib.get("description") - - # Get the acquisition hardware - acqHardware = experimentNode.attrib.get("acq_hardware") - - # Get the acquisition software - acqSoftware = experimentNode.attrib.get("acq_software") - - # Get the owner name - owner = experimentNode.attrib.get("owner_name") - - # Create the experiment (with corrected ID if needed: see above) - openBISExperiment = self.createExperiment(openBISIdentifier, - expName, openBISExpType) - if not openBISExperiment: - msg = "Could not create experiment " + openBISIdentifier - logging.error(msg) - raise Exception(msg) - - # Set the date - openBISExperiment.setPropertyValue("LSR_FORTESSA_EXPERIMENT_DATE", - expDate) - # Set the description - openBISExperiment.setPropertyValue("LSR_FORTESSA_EXPERIMENT_DESCRIPTION", - description) - - # Set the acquisition hardware - openBISExperiment.setPropertyValue("LSR_FORTESSA_EXPERIMENT_ACQ_HARDWARE", - acqHardware) - - # Set the acquisition software - openBISExperiment.setPropertyValue("LSR_FORTESSA_EXPERIMENT_ACQ_SOFTWARE", - acqSoftware) - - # Set the experiment owner - openBISExperiment.setPropertyValue("LSR_FORTESSA_EXPERIMENT_OWNER", - owner) - - # Return the openBIS Experiment object - return openBISExperiment - - def processFCSFile(self, fcsFileNode, openBISTube, openBISExperiment): - """Register the FCS File using the parsed properties file - - @param fcsFileNode An XML node corresponding to an FCS file (dataset) - @param openBISTube An ISample object representing a Tube or Well - @param openBISExperiment An ISample object representing an Experiment - """ - - # Dataset type - datasetType = "LSR_FORTESSA_FCSFILE" - - # Create a new dataset - dataset = self.transaction.createNewDataSet() - if not dataset: - msg = "Could not get or create dataset" - logging.error(msg) - raise Exception(msg) - - # Set the dataset type - dataset.setDataSetType(datasetType) - - # Assign the dataset to the sample - dataset.setSample(openBISTube) - - # Assign the dataset to the experiment - dataset.setExperiment(openBISExperiment) - - # Set the file type - dataset.setFileFormatType("FCS") - - # Assign the file to the dataset (we will use the absolute path) - fileName = fcsFileNode.attrib.get("relativeFileName") - fileName = os.path.join(self.incoming.getAbsolutePath(), fileName) - - # Log - logging.info("PROCESSFCSFILE: Registering file: " + fileName) - - # Move the file - self.transaction.moveFile(fileName, dataset) - - - def processTray(self, trayNode, openBISExperiment): - """Register a Tray (Plate) based on the Tray XML node - and an IExperimentUpdatable object - - @param trayNode An XML node corresponding to a Tray (Plate) - @param openBISExperiment An IExperimentUpdatable object - @param openBISSampleType sample type (default "LSR_FORTESSA_PLATE") - @return ISample sample, or null - """ - - # openBIS sample type - openBISSampleType = "LSR_FORTESSA_PLATE" - - # Get the identifier of the space all relevant attributes - openBISSpaceIdentifier = \ - trayNode.attrib.get("openBISSpaceIdentifier") - - # Get the tray name - name = trayNode.attrib.get("name") - - # Get the tray geometry - trayGeometry = trayNode.attrib.get("trayGeometry") - - # Create the sample. The Plate is configured in openBIS to - # auto-generate its own identifier. - openBISTray = self.createSampleWithGenCode(openBISSpaceIdentifier, - openBISSampleType) - if not openBISTray: - msg = "Could not create plate sample." - logging.error(msg) - raise Exception(msg) - - # Set the experiment for the sample - openBISTray.setExperiment(openBISExperiment) - - # Set the plate name - openBISTray.setPropertyValue("LSR_FORTESSA_PLATE_NAME", name) - - # Set the tray geometry - openBISTray.setPropertyValue("LSR_FORTESSA_PLATE_GEOMETRY", trayGeometry) - - # Return the openBIS ISample object - return openBISTray - - - def processTubeOrWell(self, tubeNode, openBISContainerSample, - specimenName, openBISExperiment): - """Register a Tube or Well (as a child of a Specimen) based on the Tube or - Well XML node and an ISample object. - - The associated fcs file is attached as a IDataset - - @param tubeNode An XML node corresponding to a Tube or Well - @param openBISContainerSample An ISample object that will contain - the Tube or Well - @param specimenName Name of the specimen associated to the Tube or Well - @param openBISExperiment The IExperiment to which the Tube belongs - @param openBISSpecimenType (default "LSR_FORTESSA_TUBE"), the - sample type. One of LSR_FORTESSA_TUBE and LSR_FORTESSA_WELL. - @return ISample sample, or null - """ - - # Get the name - name = tubeNode.attrib.get("name") - - # openBIS type - if tubeNode.tag == "Tube": - openBISSpecimenType = "LSR_FORTESSA_TUBE" - elif tubeNode.tag == "Well": - openBISSpecimenType = "LSR_FORTESSA_WELL" - else: - msg = "Unknown tube type" + tubeNode.tag - logging.error(msg) - raise Exception(msg) - - # Build the openBIS Identifier - openBISSpaceIdentifier = \ - tubeNode.attrib.get("openBISSpaceIdentifier") - - # Create the sample. The Tube/Well is configured in openBIS to - # auto-generate its own identifier. - openBISTube = self.createSampleWithGenCode(openBISSpaceIdentifier, - openBISSpecimenType) - if not openBISTube: - msg = "Could not create sample with auto-generated identifier" - logging.error(msg) - raise Exception(msg) - - # Set the experiment to which it belongs - openBISTube.setExperiment(openBISExperiment) - - # Set the Specimen name as a property - openBISTube.setPropertyValue("LSR_FORTESSA_SPECIMEN", specimenName) - - # Set the name - if openBISSpecimenType == "LSR_FORTESSA_TUBE": - openBISTube.setPropertyValue("LSR_FORTESSA_TUBE_NAME", name) - elif openBISSpecimenType == "LSR_FORTESSA_WELL": - openBISTube.setPropertyValue("LSR_FORTESSA_WELL_NAME", name) - else: - msg = "Unknown value for openBISSpecimenType." - logging.error(msg) - raise Exception(msg) - - # Set the TubeSet container - openBISTube.setContainer(openBISContainerSample) - - # Return the openBIS ISample - return openBISTube - - def processTubeSet(self, experimentNode, openBISExperiment): - """Register a TubeSet (virtual tube container). - - @param experimentNode An XML node corresponding to an Experiment - @param openBISExperiment An IExperimentUpdatable object - @param openBISSampleType The TubeSet sample type - @return ISample sample, or null - """ - - # Sample type - openBISSampleType = "LSR_FORTESSA_TUBESET" - - # Get the identifier of the space all relevant attributes - openBISSpaceIdentifier = \ - experimentNode.attrib.get("openBISSpaceIdentifier") - - # Create the sample. The Tubeset is configured in openBIS to - # auto-generate its own identifier. - openBISTubeSet = self.createSampleWithGenCode(openBISSpaceIdentifier, - openBISSampleType) - if not openBISTubeSet: - msg = "Could not get or create TubeSet" - logging.error(msg) - raise Exception(msg) - - # Set the experiment for the sample - openBISTubeSet.setExperiment(openBISExperiment) - - logging.info("PROCESS_TUBESET: Created new TubeSet " \ - "with identifier %s, sample type %s" \ - % (openBISTubeSet.getSampleIdentifier(), - openBISSampleType)) - - # Return the openBIS ISample object - return openBISTubeSet - - def register(self, tree): - """Register the Experiment using the parsed properties file. - - @param tree ElementTree parsed from the properties XML file - """ - - # Get the root node (obitXML) - root = tree.getroot() - - # Create a virtual TubeSet - openBISTubeSet = None - - # Iterate over the children (Experiments) - for experimentNode in root: - - # The tag of the immediate children of the root experimentNode - # must be Experiment - if experimentNode.tag != "Experiment": - msg = "Expected Experiment node, found " + experimentNode.tag - logging.error(msg) - raise Exception(msg) - - # Process an Experiment XML node and get/create an IExperimentUpdatable - openBISExperiment = self.processExperiment(experimentNode, - "LSR_FORTESSA_EXPERIMENT") - - # Process children of the Experiment - for childNode in experimentNode: - - # The child of an Experiment can be a Tray or a Specimen - nodeType = childNode.tag - - if nodeType == "Specimen": - - # A specimen is a direct child of an experiment if there - # is no plate, and the FCS files are therefore associated - # to tubes. In this case, we create a virtual TubeSet - # sample container (one for all Tubes in the experiment). - if openBISTubeSet is None: - openBISTubeSet = self.processTubeSet(experimentNode, - openBISExperiment) - - # The only information we need from the Specimen is its - # name to associate to the Tubes as property - specimenNameProperty = childNode.attrib.get("name") - - # Now iterate over the children of the Specimen - for tubeNode in childNode: - - # The child of a Specimen is a Tube - if tubeNode.tag != "Tube": - msg = "Expected Tube node!" - logging.error(msg) - raise Exception(msg) - - # Process the tube node and get the openBIS object - openBISTube = self.processTubeOrWell(tubeNode, - openBISTubeSet, - specimenNameProperty, - openBISExperiment) - - # Now process the FCS file - for fcsNode in tubeNode: - - # The child of a Tube is an FCSFile - if fcsNode.tag != "FCSFile": - msg = "Expected FSC File node!" - logging.error(msg) - raise Exception(msg) - - # Process the FCS file node - self.processFCSFile(fcsNode, openBISTube, - openBISExperiment) - - elif nodeType == "Tray": - - # Process the tray node and get the openBIS object - openBISTray = self.processTray(childNode, - openBISExperiment) - - # Now iterate over the children of the Tray - for specimenNode in childNode: - - # The child of a Tray is a Specimen - if specimenNode.tag != "Specimen": - msg = "Expected Specimen node!" - logging.error(msg) - raise Exception(msg) - - # The only information we need from the Specimen is its - # name to associate to the Wells as property - specimenNameProperty = specimenNode.attrib.get("name") - - for wellNode in specimenNode: - - # The child of a Specimen is a Tube - if wellNode.tag != "Well": - msg = "Expected Well node!" - logging.error(msg) - raise Exception(msg) - - # Process the tube node and get the openBIS object - openBISWell = self.processTubeOrWell(wellNode, - openBISTray, - specimenNameProperty, - openBISExperiment) - - # Now process the FCS file - for fcsNode in wellNode: - - # The child of a Tube is an FCSFile - if fcsNode.tag != "FCSFile": - msg = "Expected FSC File node!" - logging.error(msg) - raise Exception(msg) - - # Process the FCS file node - self.processFCSFile(fcsNode, openBISWell, - openBISExperiment) - - else: - - msg = "The Node must be either a Specimen or a Tray" - logging.error(msg) - raise Exception(msg) - - # Log that we are finished with the registration - logging.info("REGISTER: Registration completed") - - - def run(self): - """Run the registration.""" - - # Make sure that incoming is a folder - if not self.incoming.isDirectory(): - msg = "Incoming MUST be a folder!" - logging.error(msg) - raise Exception(msg) - - # Log - logging.info("Incoming folder: " + self.incoming.getAbsolutePath()) - - # There must be just one subfolder: the user subfolder - subFolders = self.getSubFolders() - if len(subFolders) != 1: - msg = "Expected user subfolder!" - logging.error(msg) - raise Exception(msg) - - # Set the user folder - userFolder = os.path.join(self.incoming.getAbsolutePath(), - subFolders[0]) - - # In the user subfolder we must find the data_structure.ois file - dataFileName = os.path.join(userFolder, "data_structure.ois") - if not os.path.exists(dataFileName): - msg = "File data_structure.ois not found!" - logging.error(msg) - raise Exception(msg) - - # Now read the data structure file and store all the pointers to - # the properties files. The paths are stored relative to self.incoming, - # so we can easily build the full file paths. - propertiesFileList = [] - f = open(dataFileName) - try: - for line in f: - line = re.sub('[\r\n]', '', line) - propertiesFile = os.path.join(self.incoming.getAbsolutePath(), - line) - propertiesFileList.append(propertiesFile) - finally: - f.close() - - # Process (and ultimately register) all experiments - for propertiesFile in propertiesFileList: - - # Log - logging.info("* * * Processing: " + propertiesFile) - - # Read the properties file into an ElementTree - tree = xml.parse(propertiesFile) - - # Now register the experiment - self.register(tree) - - -def process(transaction): - """Dropbox entry point. - - @param transaction, the transaction object - """ - - # Get path to containing folder - # __file__ does not work (reliably) in Jython - dbPath = "../core-plugins/microscopy/1/dss/drop-boxes/BDLSRFortessaDropbox" - - # Path to the logs subfolder - logPath = os.path.join(dbPath, "logs") - - # Make sure the logs subforder exist - if not os.path.exists(logPath): - os.makedirs(logPath) - - # Path for the log file - logFile = os.path.join(logPath, "registration_log.txt") - - # Create a Processor - processor = Processor(transaction, logFile) - - # Run - processor.run() diff --git a/plasmid/source/drop-boxes/facs_data/import_facs.py b/plasmid/source/drop-boxes/facs_data/import_facs.py deleted file mode 100644 index 08bb8f864079bded6675ca2a47851b8c27739054..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/facs_data/import_facs.py +++ /dev/null @@ -1,543 +0,0 @@ -#! /usr/bin/env python -""" - Script for uploading FACS data for the YeastLab. - - FACS data are organized in one main folder which contains a folder with the username. Inside this folder there are folders and subfolders that correspond - to different FACS experiments. Inside the username folder there is a file called data_structure.ois which contains the structure of the FACS experiments. - This script creates a sample in openBIS for each FACS experiment and uploads the corresponding data in one dataset connected to the samples. - The space where the sample should go is detected from the username. The project and experiment are detected from the name of the folders given by the user. - The FACS experiment should be named by the users as PROJECT-EXPERIMENT-SAMPLE. - The script also automatically assign teh FREEFORM_TABLE_STATE property, which creates tables in the ELN UI. If there are plates in the directories (these are directories named "96 Wells") - it creates 96-well plates table (8x12); if there are .fcs files it creates a table with one row and as many columns as there are .fcs files. Multiple tables for one sample can be created. - - -""" - -import os, glob, re, csv, time, shutil -from java.io import File -from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import SimpleImageDataConfig, ImageMetadata, Location -from ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto import Geometry -from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import SimpleImageContainerDataConfig, ChannelColor -from loci.formats import ImageReader -from time import * -from datetime import * - -print "##############################################################" - -def process(transaction): - incoming = transaction.getIncoming() - - projectNameList=[] - experimentNameList=[] - sampleNameList=[] - directoryToImportList=[] - userNameList=[] - - - # read the data_structure.ois file to get the structure of the FACS experiment. The name of the FACS experiment contains project, experiment, sample info for openBIS. - def getProjExpSample(incoming): - for userName in os.listdir(incoming): - if not userName.startswith('.'): - dataStructure = incoming + "/" + userName + "/data_structure.ois" - f = open(dataStructure) - lines=f.readlines() - for line in lines: - path = re.split("/", line) - directoryToImport= incoming +"/"+ "/".join(path[:-1]) - projectName = re.split("-",path[-1])[0] - if len(re.split("-",path[-1])) == 3: #in some cases the user specifies the sample name in the file name - experimentName = re.split("-",path[-1])[1] - sampleNameFile = re.split("-",path[-1])[2] - sampleName = re.split("_properties.oix", sampleNameFile)[0] - elif len(re.split("-",path[-1]))==2: #in some cases the sample name is not in the file name, and it will be generated by openBIS - experimentNameProp = re.split("-",path[-1])[1] - experimentName = re.split("_properties.oix", experimentNameProp)[0] - sampleName = "na" - - - projectNameList.append(projectName) - experimentNameList.append(experimentName) - sampleNameList.append(sampleName) - directoryToImportList.append(directoryToImport) - userNameList.append(userName) - - return userNameList, projectNameList, experimentNameList, sampleNameList, directoryToImportList - - - getProjExpSample(incoming.getPath()) - - - #get the space according to the user - for user in set (userNameList): - if user == "pontia": - space = "AARON" - elif user == "ottozd": - space = "DIANA" - elif user == "elfstrok": - space = "KRISTINA" - elif user == "rgnuegge": - space = "ROBERT" - - #get or create the project - for proj in set(projectNameList): - project = transaction.getProject("/" + space + "/" + proj) - if not project: - project = transaction.createNewProject("/" + space + "/" + proj) - - #get or create the experiment - for exp in set(experimentNameList): - experiment = transaction.getExperiment("/" + space + "/" + proj + "/" + exp) - if not experiment: - experiment = transaction.createNewExperiment("/" + space + "/" + proj + "/" + exp, "ANALYSIS") - - #create te samples, upload the datasets for the sample, create the tables for the ELN UI - for sample, directory in zip(sampleNameList,directoryToImportList): - - table =[] - all_subdir_list=[] - fcs_file_plate_list=[] - - for all_subdir in os.listdir(directory): - if not all_subdir.startswith('.'): - (all_subdir_name, all_subdir_ext) = os.path.splitext(all_subdir) - if not (all_subdir_ext): - plate_content = directory + "/" + all_subdir_name - - A1 = str(glob.glob(os.path.join(plate_content, "*A01.fcs"))) - if not A1: - A1 = '' - (A1_content, A1_ext)= os.path.splitext(os.path.basename(A1)) - A2 = str(glob.glob(os.path.join(plate_content, "*A02.fcs"))) - if not A2: - A2 = '' - (A2_content, A2_ext)= os.path.splitext(os.path.basename(A2)) - A3 = str(glob.glob(os.path.join(plate_content, "*A03.fcs"))) - if not A3: - A3 = '' - (A3_content, A3_ext)= os.path.splitext(os.path.basename(A3)) - A4 = str(glob.glob(os.path.join(plate_content, "*A04.fcs"))) - if not A4: - A4 = '' - (A4_content, A4_ext)= os.path.splitext(os.path.basename(A4)) - A5 = str(glob.glob(os.path.join(plate_content, "*A05.fcs"))) - if not A5: - A5 = '' - (A5_content, A5_ext)= os.path.splitext(os.path.basename(A5)) - A6 = str(glob.glob(os.path.join(plate_content, "*A06.fcs"))) - if not A6: - A6 = '' - (A6_content, A6_ext)= os.path.splitext(os.path.basename(A6)) - A7 = str(glob.glob(os.path.join(plate_content, "*A07.fcs"))) - if not A7: - A7 = '' - (A7_content, A7_ext)= os.path.splitext(os.path.basename(A7)) - A8 = str(glob.glob(os.path.join(plate_content, "*A08.fcs"))) - if not A8: - A8 = '' - (A8_content, A8_ext)= os.path.splitext(os.path.basename(A8)) - A9 = str(glob.glob(os.path.join(plate_content, "*A09.fcs"))) - if not A9: - A9 = '' - (A9_content, A9_ext)= os.path.splitext(os.path.basename(A9)) - A10 = str(glob.glob(os.path.join(plate_content, "*A10.fcs"))) - if not A10: - A10 = '' - (A10_content, A10_ext)= os.path.splitext(os.path.basename(A10)) - A11 = str(glob.glob(os.path.join(plate_content, "*A11.fcs"))) - if not A11: - A11 = '' - (A11_content, A11_ext)= os.path.splitext(os.path.basename(A11)) - A12 = str(glob.glob(os.path.join(plate_content, "*A12.fcs"))) - if not A12: - A12 = '' - (A12_content, A12_ext)= os.path.splitext(os.path.basename(A12)) - - B1 = str(glob.glob(os.path.join(plate_content, "*B01.fcs"))) - if not B1: - B1 = '' - (B1_content, B1_ext)= os.path.splitext(os.path.basename(B1)) - B2 = str(glob.glob(os.path.join(plate_content, "*B02.fcs"))) - if not B2: - B2 = '' - (B2_content, B2_ext)= os.path.splitext(os.path.basename(B2)) - B3 = str(glob.glob(os.path.join(plate_content, "*B03.fcs"))) - if not B3: - B3 = '' - (B3_content, B3_ext)= os.path.splitext(os.path.basename(B3)) - B4 = str(glob.glob(os.path.join(plate_content, "*B04.fcs"))) - if not B4: - B4 = '' - (B4_content, B4_ext)= os.path.splitext(os.path.basename(B4)) - B5 = str(glob.glob(os.path.join(plate_content, "*B05.fcs"))) - if not B5: - B5 = '' - (B5_content, B5_ext)= os.path.splitext(os.path.basename(B5)) - B6 = str(glob.glob(os.path.join(plate_content, "*B06.fcs"))) - if not B6: - B6 = '' - (B6_content, B6_ext)= os.path.splitext(os.path.basename(B6)) - B7 = str(glob.glob(os.path.join(plate_content, "*B07.fcs"))) - if not B7: - B7 = '' - (B7_content, B7_ext)= os.path.splitext(os.path.basename(B7)) - B8 = str(glob.glob(os.path.join(plate_content, "*B08.fcs"))) - if not B8: - B8 = '' - (B8_content, B8_ext)= os.path.splitext(os.path.basename(B8)) - B9 = str(glob.glob(os.path.join(plate_content, "*B09.fcs"))) - if not B9: - B9 = '' - (B9_content, B9_ext)= os.path.splitext(os.path.basename(B9)) - B10 = str(glob.glob(os.path.join(plate_content, "*B10.fcs"))) - if not B10: - B10 = '' - (B10_content, B10_ext)= os.path.splitext(os.path.basename(B10)) - B11 = str(glob.glob(os.path.join(plate_content, "*B11.fcs"))) - if not B11: - B11 = '' - (B11_content, B11_ext)= os.path.splitext(os.path.basename(B11)) - B12 = str(glob.glob(os.path.join(plate_content, "*B12.fcs"))) - if not B12: - B12 = '' - (B12_content, B12_ext)= os.path.splitext(os.path.basename(B12)) - - C1 = str(glob.glob(os.path.join(plate_content, "*C01.fcs"))) - if not C1: - C1 = '' - (C1_content, C1_ext)= os.path.splitext(os.path.basename(C1)) - C2 = str(glob.glob(os.path.join(plate_content, "*C02.fcs"))) - if not C2: - C2 = '' - (C2_content, C2_ext)= os.path.splitext(os.path.basename(C2)) - C3 = str(glob.glob(os.path.join(plate_content, "*C03.fcs"))) - if not C3: - C3 = '' - (C3_content, C3_ext)= os.path.splitext(os.path.basename(C3)) - C4 = str(glob.glob(os.path.join(plate_content, "*C04.fcs"))) - if not C4: - C4 = '' - (C4_content, C4_ext)= os.path.splitext(os.path.basename(C4)) - C5 = str(glob.glob(os.path.join(plate_content, "*C05.fcs"))) - if not C5: - C5 = '' - (C5_content, C5_ext)= os.path.splitext(os.path.basename(C5)) - C6 = str(glob.glob(os.path.join(plate_content, "*C06.fcs"))) - if not C6: - C6 = '' - (C6_content, C6_ext)= os.path.splitext(os.path.basename(C6)) - C7 = str(glob.glob(os.path.join(plate_content, "*C07.fcs"))) - if not C7: - C7 = '' - (C7_content, C7_ext)= os.path.splitext(os.path.basename(C7)) - C8 = str(glob.glob(os.path.join(plate_content, "*C08.fcs"))) - if not C8: - C8 = '' - (C8_content, C8_ext)= os.path.splitext(os.path.basename(C8)) - C9 = str(glob.glob(os.path.join(plate_content, "*C09.fcs"))) - if not C9: - C9 = '' - (C9_content, C9_ext)= os.path.splitext(os.path.basename(C9)) - C10 = str(glob.glob(os.path.join(plate_content, "*C10.fcs"))) - if not C10: - C10 = '' - (C10_content, C10_ext)= os.path.splitext(os.path.basename(C10)) - C11 = str(glob.glob(os.path.join(plate_content, "*C11.fcs"))) - if not C11: - C11 = '' - (C11_content, C11_ext)= os.path.splitext(os.path.basename(C11)) - C12 = str(glob.glob(os.path.join(plate_content, "*C12.fcs"))) - if not C12: - C12 = '' - (C12_content, C12_ext)= os.path.splitext(os.path.basename(C12)) - - - D1 = str(glob.glob(os.path.join(plate_content, "*D01.fcs"))) - if not D1: - D1 = '' - (D1_content, D1_ext)= os.path.splitext(os.path.basename(D1)) - D2 = str(glob.glob(os.path.join(plate_content, "*D02.fcs"))) - if not D2: - D2 = '' - (D2_content, D2_ext)= os.path.splitext(os.path.basename(D2)) - D3 = str(glob.glob(os.path.join(plate_content, "*D03.fcs"))) - if not D3: - D3 = '' - (D3_content, D3_ext)= os.path.splitext(os.path.basename(D3)) - D4 = str(glob.glob(os.path.join(plate_content, "*D04.fcs"))) - if not D4: - D4 = '' - (D4_content, D4_ext)= os.path.splitext(os.path.basename(D4)) - D5 = str(glob.glob(os.path.join(plate_content, "*D05.fcs"))) - if not D5: - D5 = '' - (D5_content, D5_ext)= os.path.splitext(os.path.basename(D5)) - D6 = str(glob.glob(os.path.join(plate_content, "*D06.fcs"))) - if not D6: - D6 = '' - (D6_content, D6_ext)= os.path.splitext(os.path.basename(D6)) - D7 = str(glob.glob(os.path.join(plate_content, "*D07.fcs"))) - if not D7: - D7 = '' - (D7_content, D7_ext)= os.path.splitext(os.path.basename(D7)) - D8 = str(glob.glob(os.path.join(plate_content, "*D08.fcs"))) - if not D8: - D8 = '' - (D8_content, D8_ext)= os.path.splitext(os.path.basename(D8)) - D9 = str(glob.glob(os.path.join(plate_content, "*D09.fcs"))) - if not D9: - D9 = '' - (D9_content, D9_ext)= os.path.splitext(os.path.basename(D9)) - D10 = str(glob.glob(os.path.join(plate_content, "*D10.fcs"))) - if not D10: - D10 = '' - (D10_content, D10_ext)= os.path.splitext(os.path.basename(D10)) - D11 = str(glob.glob(os.path.join(plate_content, "*D11.fcs"))) - if not D11: - D11 = '' - (D11_content, D11_ext)= os.path.splitext(os.path.basename(D11)) - D12 = str(glob.glob(os.path.join(plate_content, "*D12.fcs"))) - if not D12: - D12 = '' - (D12_content, D12_ext)= os.path.splitext(os.path.basename(D12)) - - - E1 = str(glob.glob(os.path.join(plate_content, "*E01.fcs"))) - if not E1: - E1 = '' - (E1_content, E1_ext)= os.path.splitext(os.path.basename(E1)) - E2 = str(glob.glob(os.path.join(plate_content, "*E02.fcs"))) - if not E2: - E2 = '' - (E2_content, E2_ext)= os.path.splitext(os.path.basename(E2)) - E3 = str(glob.glob(os.path.join(plate_content, "*E03.fcs"))) - if not E3: - E3 = '' - (E3_content, E3_ext)= os.path.splitext(os.path.basename(E3)) - E4 = str(glob.glob(os.path.join(plate_content, "*E04.fcs"))) - if not E4: - E4 = '' - (E4_content, E4_ext)= os.path.splitext(os.path.basename(E4)) - E5 = str(glob.glob(os.path.join(plate_content, "*E05.fcs"))) - if not E5: - E5 = '' - (E5_content, E5_ext)= os.path.splitext(os.path.basename(E5)) - E6 = str(glob.glob(os.path.join(plate_content, "*E06.fcs"))) - if not E6: - E6 = '' - (E6_content, E6_ext)= os.path.splitext(os.path.basename(E6)) - E7 = str(glob.glob(os.path.join(plate_content, "*E07.fcs"))) - if not E7: - E7 = '' - (E7_content, E7_ext)= os.path.splitext(os.path.basename(E7)) - E8 = str(glob.glob(os.path.join(plate_content, "*E08.fcs"))) - if not E8: - E8 = '' - (E8_content, E8_ext)= os.path.splitext(os.path.basename(E8)) - E9 = str(glob.glob(os.path.join(plate_content, "*E09.fcs"))) - if not E9: - E9 = '' - (E9_content, E9_ext)= os.path.splitext(os.path.basename(E9)) - E10 = str(glob.glob(os.path.join(plate_content, "*E10.fcs"))) - if not E10: - E10 = '' - (E10_content, E10_ext)= os.path.splitext(os.path.basename(E10)) - E11 = str(glob.glob(os.path.join(plate_content, "*E11.fcs"))) - if not E11: - E11 = '' - (E11_content, E11_ext)= os.path.splitext(os.path.basename(E11)) - E12 = str(glob.glob(os.path.join(plate_content, "*E12.fcs"))) - if not E12: - E12 = '' - (E12_content, E12_ext)= os.path.splitext(os.path.basename(E12)) - - - F1 = str(glob.glob(os.path.join(plate_content, "*F01.fcs"))) - if not F1: - F1 = '' - (F1_content, F1_ext)= os.path.splitext(os.path.basename(F1)) - F2 = str(glob.glob(os.path.join(plate_content, "*F02.fcs"))) - if not F2: - F2 = '' - (F2_content, F2_ext)= os.path.splitext(os.path.basename(F2)) - F3 = str(glob.glob(os.path.join(plate_content, "*F03.fcs"))) - if not F3: - F3 = '' - (F3_content, F3_ext)= os.path.splitext(os.path.basename(F3)) - F4 = str(glob.glob(os.path.join(plate_content, "*F04.fcs"))) - if not F4: - F4 = '' - (F4_content, F4_ext)= os.path.splitext(os.path.basename(F4)) - F5 = str(glob.glob(os.path.join(plate_content, "*F05.fcs"))) - if not F5: - F5 = '' - (F5_content, F5_ext)= os.path.splitext(os.path.basename(F5)) - F6 = str(glob.glob(os.path.join(plate_content, "*F06.fcs"))) - if not F6: - F6 = '' - (F6_content, F6_ext)= os.path.splitext(os.path.basename(F6)) - F7 = str(glob.glob(os.path.join(plate_content, "*F07.fcs"))) - if not F7: - F7 = '' - (F7_content, F7_ext)= os.path.splitext(os.path.basename(F7)) - F8 = str(glob.glob(os.path.join(plate_content, "*F08.fcs"))) - if not F8: - F8 = '' - (F8_content, F8_ext)= os.path.splitext(os.path.basename(F8)) - F9 = str(glob.glob(os.path.join(plate_content, "*F09.fcs"))) - if not F9: - F9 = '' - (F9_content, F9_ext)= os.path.splitext(os.path.basename(F9)) - F10 = str(glob.glob(os.path.join(plate_content, "*F10.fcs"))) - if not F10: - F10 = '' - (F10_content, F10_ext)= os.path.splitext(os.path.basename(F10)) - F11 = str(glob.glob(os.path.join(plate_content, "*F11.fcs"))) - if not F11: - F11 = '' - (F11_content, F11_ext)= os.path.splitext(os.path.basename(F11)) - F12 = str(glob.glob(os.path.join(plate_content, "*F12.fcs"))) - if not F12: - F12 = '' - (F12_content, F12_ext)= os.path.splitext(os.path.basename(F12)) - - - G1 = str(glob.glob(os.path.join(plate_content, "*G01.fcs"))) - if not G1: - G1 = '' - (G1_content, G1_ext)= os.path.splitext(os.path.basename(G1)) - G2 = str(glob.glob(os.path.join(plate_content, "*G02.fcs"))) - if not G2: - G2 = '' - (G2_content, G2_ext)= os.path.splitext(os.path.basename(G2)) - G3 = str(glob.glob(os.path.join(plate_content, "*G03.fcs"))) - if not G3: - G3 = '' - (G3_content, G3_ext)= os.path.splitext(os.path.basename(G3)) - G4 = str(glob.glob(os.path.join(plate_content, "*G04.fcs"))) - if not G4: - G4 = '' - (G4_content, G4_ext)= os.path.splitext(os.path.basename(G4)) - G5 = str(glob.glob(os.path.join(plate_content, "*G05.fcs"))) - if not G5: - G5 = '' - (G5_content, G5_ext)= os.path.splitext(os.path.basename(G5)) - G6 = str(glob.glob(os.path.join(plate_content, "*G06.fcs"))) - if not G6: - G6 = '' - (G6_content, G6_ext)= os.path.splitext(os.path.basename(G6)) - G7 = str(glob.glob(os.path.join(plate_content, "*G07.fcs"))) - if not G7: - G7 = '' - (G7_content, G7_ext)= os.path.splitext(os.path.basename(G7)) - G8 = str(glob.glob(os.path.join(plate_content, "*G08.fcs"))) - if not G8: - G8 = '' - (G8_content, G8_ext)= os.path.splitext(os.path.basename(G8)) - G9 = str(glob.glob(os.path.join(plate_content, "*G09.fcs"))) - if not G9: - G9 = '' - (G9_content, G9_ext)= os.path.splitext(os.path.basename(G9)) - G10 = str(glob.glob(os.path.join(plate_content, "*G10.fcs"))) - if not G10: - G10 = '' - (G10_content, G10_ext)= os.path.splitext(os.path.basename(G10)) - G11 = str(glob.glob(os.path.join(plate_content, "*G11.fcs"))) - if not G11: - G11 = '' - (G11_content, G11_ext)= os.path.splitext(os.path.basename(G11)) - G12 = str(glob.glob(os.path.join(plate_content, "*G12.fcs"))) - if not G12: - G12 = '' - (G12_content, G12_ext)= os.path.splitext(os.path.basename(G12)) - - H1 = str(glob.glob(os.path.join(plate_content, "*H01.fcs"))) - if not H1: - H1 = '' - (H1_content, H1_ext)= os.path.splitext(os.path.basename(H1)) - H2 = str(glob.glob(os.path.join(plate_content, "*H02.fcs"))) - if not H2: - H2 = '' - (H2_content, H2_ext)= os.path.splitext(os.path.basename(H2)) - H3 = str(glob.glob(os.path.join(plate_content, "*H03.fcs"))) - if not H3: - H3 = '' - (H3_content, H3_ext)= os.path.splitext(os.path.basename(H3)) - H4 = str(glob.glob(os.path.join(plate_content, "*H04.fcs"))) - if not H4: - H4 = '' - (H4_content, H4_ext)= os.path.splitext(os.path.basename(H4)) - H5 = str(glob.glob(os.path.join(plate_content, "*H05.fcs"))) - if not H5: - H5 = '' - (H5_content, H5_ext)= os.path.splitext(os.path.basename(H5)) - H6 = str(glob.glob(os.path.join(plate_content, "*H06.fcs"))) - if not H6: - H6 = '' - (H6_content, H6_ext)= os.path.splitext(os.path.basename(H6)) - H7 = str(glob.glob(os.path.join(plate_content, "*H07.fcs"))) - if not H7: - H7 = '' - (H7_content, H7_ext)= os.path.splitext(os.path.basename(H7)) - H8 = str(glob.glob(os.path.join(plate_content, "*H08.fcs"))) - if not H8: - H8 = '' - (H8_content, H8_ext)= os.path.splitext(os.path.basename(H8)) - H9 = str(glob.glob(os.path.join(plate_content, "*H09.fcs"))) - if not H9: - H9 = '' - (H9_content, H9_ext)= os.path.splitext(os.path.basename(H9)) - H10 = str(glob.glob(os.path.join(plate_content, "*H10.fcs"))) - if not H10: - H10 = '' - (H10_content, H10_ext)= os.path.splitext(os.path.basename(H10)) - H11 = str(glob.glob(os.path.join(plate_content, "*H11.fcs"))) - if not H11: - H11 = '' - (H11_content, H11_ext)= os.path.splitext(os.path.basename(H11)) - H12 = str(glob.glob(os.path.join(plate_content, "*H12.fcs"))) - if not H12: - H12 = '' - (H12_content, H12_ext)= os.path.splitext(os.path.basename(H12)) - - - t = "{\"name\":\"\",\"modelDetailed\":[[""\"" + A1_content + "\" ," "\"" + A2_content + "\"," "\"" + A3_content + "\"," "\"" + A4_content + "\"," "\"" + A5_content + "\"," "\"" + A6_content + "\"," "\"" + A7_content + "\"," "\"" + A8_content + "\"," "\"" + A9_content + "\"," "\"" + A10_content + "\"," "\"" + A11_content + "\"," "\"" + A12_content + "\"""],[""\"" + B1_content + "\" ," "\"" + B2_content + "\"," "\"" + B3_content + "\"," "\"" + B4_content + "\"," "\"" + B5_content + "\"," "\"" + B6_content + "\"," "\"" + B7_content + "\"," "\"" + B8_content + "\"," "\"" + B9_content + "\"," "\"" + B10_content + "\"," "\"" + B11_content + "\"," "\"" + B12_content + "\"""],[""\"" + C1_content + "\" ," "\"" + C2_content + "\"," "\"" + C3_content + "\"," "\"" + C4_content + "\"," "\"" + C5_content + "\"," "\"" + C6_content + "\"," "\"" + C7_content + "\"," "\"" + C8_content + "\"," "\"" + C9_content + "\"," "\"" + C10_content + "\"," "\"" + C11_content + "\"," "\"" + C12_content + "\"""],[""\"" + D1_content + "\" ," "\"" + D2_content + "\"," "\"" + D3_content + "\"," "\"" + D4_content + "\"," "\"" + D5_content + "\"," "\"" + D6_content + "\"," "\"" + D7_content + "\"," "\"" + D8_content + "\"," "\"" + D9_content + "\"," "\"" + D10_content + "\"," "\"" + D11_content + "\"," "\"" + D12_content + "\"""],[""\"" + E1_content + "\" ," "\"" + E2_content + "\"," "\"" + E3_content + "\"," "\"" + E4_content + "\"," "\"" + E5_content + "\"," "\"" + E6_content + "\"," "\"" + E7_content + "\"," "\"" + E8_content + "\"," "\"" + E9_content + "\"," "\"" + E10_content + "\"," "\"" + E11_content + "\"," "\"" + E12_content + "\"""],[""\"" + F1_content + "\" ," "\"" + F2_content + "\"," "\"" + F3_content + "\"," "\"" + F4_content + "\"," "\"" + F5_content + "\"," "\"" + F6_content + "\"," "\"" + F7_content + "\"," "\"" + F8_content + "\"," "\"" + F9_content + "\"," "\"" + F10_content + "\"," "\"" + F11_content + "\"," "\"" + F12_content + "\"""],[""\"" + G1_content + "\" ," "\"" + G2_content + "\"," "\"" + G3_content + "\"," "\"" + G4_content + "\"," "\"" + G5_content + "\"," "\"" + G6_content + "\"," "\"" + G7_content + "\"," "\"" + G8_content + "\"," "\"" + G9_content + "\"," "\"" + G10_content + "\"," "\"" + G11_content + "\"," "\"" + G12_content + "\"""],[""\"" + H1_content + "\" ," "\"" + H2_content + "\"," "\"" + H3_content + "\"," "\"" + H4_content + "\"," "\"" + H5_content + "\"," "\"" + H6_content + "\"," "\"" + H7_content + "\"," "\"" + H8_content + "\"," "\"" + H9_content + "\"," "\"" + H10_content + "\"," "\"" + H11_content + "\"," "\"" + H12_content + "\"""]],\"modelMini\":{\"rows\":[null,null,null,null,null,null,null,null],\"columns\":[null,null,null,null,null,null,null,null,null,null,null,null]}}" - - table.append(t) - elif all_subdir_ext == ".fcs": - all_subdir_list.append(all_subdir_name) - - - - - - - s = "[\"" + "\",\"".join(str(x) for x in all_subdir_list) + "\"]" #write the filename in each column of teh table - t = "{\"name\":\"\",\"modelDetailed\":[" + s + "],\"modelMini\":{\"rows\":[\"\"],\"columns\":" + s + "}}" #for single samples (not in plates) create a table with only one row and as many columns as samples. - table.append(t) - - - freeform_table = "[" +','.join(map(str,table)) +"]" - - print "FREFORM", freeform_table - - if sample == "na": - sampleNew = transaction.createNewSampleWithGeneratedCode(space, "RESULT") - sampleNew.setExperiment(experiment) - sampleNew.setPropertyValue("FREEFORM_TABLE_STATE", freeform_table) - else: - sampleNew = transaction.createNewSample("/" + space + "/" + sample, "RESULT" ) - sampleNew.setExperiment(experiment) - sampleNew.setPropertyValue("FREEFORM_TABLE_STATE", freeform_table) - - - dataSet = transaction.createNewDataSet() - dataSet.setDataSetType("FACS_DATA_RAW") - dataSet.setSample(sampleNew) - transaction.moveFile(directory, dataSet) - - - - - - - diff --git a/plasmid/source/drop-boxes/facs_data/plugin.properties b/plasmid/source/drop-boxes/facs_data/plugin.properties deleted file mode 100644 index d7b020e7b35dcad1c7613baea737340d7de9f4fb..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/facs_data/plugin.properties +++ /dev/null @@ -1,19 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -#input = image-dropbox -dropbox-name = facs_data - -incoming-dir = /Users/barillac/openbis-screening2/data/incoming-facs -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = import_facs.py -#script-path =BDLSRFortessaDropbox.py -program-class = ch.systemsx.cisd.etlserver.registrator.api.v2.ExampleJavaDataSetRegistrationDropboxV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/plasmid/source/drop-boxes/general-protocols-dropbox/plugin.properties b/plasmid/source/drop-boxes/general-protocols-dropbox/plugin.properties deleted file mode 100644 index 3dce7f268a43d65cf94c12a57589e6a93fd2696b..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/general-protocols-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = general-protocols-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-generalProtocol-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/general-protocols-dropbox/xml_import-generalProtocol-dropbox-v2.py b/plasmid/source/drop-boxes/general-protocols-dropbox/xml_import-generalProtocol-dropbox-v2.py deleted file mode 100644 index b1873bea989feb3789e41145fde71d9558519ca0..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/general-protocols-dropbox/xml_import-generalProtocol-dropbox-v2.py +++ /dev/null @@ -1,534 +0,0 @@ -#! /usr/bin/env python -""" - Import general protocols from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME='name' -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' -NAME_LABEL = 'name' - -chemicals_list=[] -quantity_list=[] -buffers_list=[] -buffers_quantity_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -medias_list=[] -medias_quantity_list=[] -protocols_list=[] -enzymes_list=[] - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - print experiment_name - else: - node.text = "" - - - - def Protocols(): - for path in [ './General_Protocol']: - node = tree.find(path) - if node.text is not None: - protocols = node.text - tokens = protocols.split(',') - for token in tokens: - protocols_name=token - protocols_list.append(protocols_name) - else: - node.text = "n.a." - return protocols_list - - Protocols() - - - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_quantity=token[1] - chemicals_list.append(chemical_name) - quantity_list.append(chemical_quantity) - else: - chemical_name=token - chemical_quantity = "n.a." - chemicals_list.append(chemical_name) - quantity_list.append(chemical_quantity) - else: - node.text = "n.a." - return chemicals_list, quantity_list - - Chemicals() - - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_quantity=token[1] - buffers_list.append(buffer_name) - buffers_quantity_list.append(buffer_quantity) - else: - buffer_name=token - buffer_quantity = "n.a." - buffers_list.append(buffer_name) - buffers_quantity_list.append(buffer_quantity) - else: - node.text = "n.a." - return buffers_list, buffers_quantity_list - - Buffers() - - def Medias(): - for path in [ './Media']: - node = tree.find(path) - if node.text is not None: - medias = node.text - tokens = medias.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - media_name = token[0] - media_quantity=token[1] - medias_list.append(media_name) - medias_quantity_list.append(media_quantity) - else: - media_name=token - media_quantity = "n.a." - medias_list.append(media_name) - medias_quantity_list.append(media_quantity) - else: - node.text = "n.a." - return medias_list, medias_quantity_list - - Medias() - - - def Enzymes(): - for path in [ './Enzymes']: - node = tree.find(path) - if node.text is not None: - enzymes = node.text - tokens = enzymes.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - enzyme_name = token[0] - enzyme_concentration=token[1] - enzymes_list.append(enzyme_name) - else: - enzyme_name=token - enzyme_concentration = "n.a." - enzymes_list.append(enzyme_name) - else: - node.text = "n.a." - return enzymes_list - - Enzymes() - - - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, quantity_list): - elements = [] - input = chemicals_list - input2 = quantity_list - if input != "": - for i, j in zip(chemicals_list,quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, buffers_quantity_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_quantity_list): - elements = [] - input = buffers_list - input2 = buffers_quantity_list - if input != "": - for i, j in zip(buffers_list,buffers_quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createMediasLink(medias_list, medias_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if medias_list is not None: - mediasPath= "/YEAST_LAB/" + medias_list - permId =transaction.getSample(mediasPath).getSample().getPermId() - if not permId: - permId = medias_list - name = transaction.getSample(mediasPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, medias_quantity_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateMediasFromBatchInput(medias_list, medias_quantity_list): - elements = [] - input = medias_list - input2 = medias_quantity_list - if input != "": - for i, j in zip(medias_list,medias_quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createMediasLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT PROTOCOLS#################################################################### - - - def _createProtocolsLink(protocols_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if protocols_list is not None: - protocolsPath= "/YEAST_LAB/" + protocols_list - permId =transaction.getSample(protocolsPath).getSample().getPermId() - if not permId: - permId = protocols_list - name = transaction.getSample(protocolsPath).getPropertyValue("NAME") - if name is None: - name = "n.a." - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, protocols_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateProtocolsFromBatchInput(protocols_list): - elements = [] - input = protocols_list - if input != "": - for i in protocols_list: - sampleLink = _createProtocolsLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - updateProtocolsFromBatchInput(protocols_list) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - -###IMPORT ENZYMES#################################################################### - - - def _createEnzymesLink(enzymes_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if enzymes_list is not None: - enzymesPath= "/YEAST_LAB/" + enzymes_list - permId =transaction.getSample(enzymesPath).getSample().getPermId() - if not permId: - permId = enzymes_list - name = transaction.getSample(enzymesPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, enzymes_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateEnzymesFromBatchInput(enzymes_list): - elements = [] - input = enzymes_list - if input != "": - for i in enzymes_list: - sampleLink = _createEnzymesLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'GENERAL_PROTOCOL') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set medias, chemicals, protocols, buffers as parents for the sample""" - - - protocolId_list =[] - for protocol in protocols_list: - protocolIdentifier = "/YEAST_LAB/" + protocol.strip() - protocolId_list.append(protocolIdentifier) - - mediaId_list =[] - for media in medias_list: - mediaIdentifier = "/YEAST_LAB/" + media.strip() - mediaId_list.append(mediaIdentifier) - - chemicalId_list =[] - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - enzymeId_list =[] - for enzyme in enzymes_list: - enzymeIdentifier = "/YEAST_LAB/" + enzyme.strip() - enzymeId_list.append(enzymeIdentifier) - - - parents_list = protocolId_list + mediaId_list + chemicalId_list + bufferId_list - newSample.setParentSampleIdentifiers(parents_list) - - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,quantity_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_quantity_list)) - if child.tag == "Media": - newSample.setPropertyValue("Media",updateMediasFromBatchInput(medias_list,medias_quantity_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag == "General_Protocol": - newSample.setPropertyValue("GENERAL_PROTOCOL", updateProtocolsFromBatchInput(protocols_list)) - if child.tag == "Enzymes": - newSample.setPropertyValue("Enzymes",updateEnzymesFromBatchInput(enzymes_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Media" and child.tag!= "General_Protocol" and child.tag!="Enzymes": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-buffers-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-buffers-dropbox/plugin.properties deleted file mode 100644 index f70082b6c31a988f1a2ac2dfe0548df951c500c7..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-buffers-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-buffers-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-Buffers-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-buffers-dropbox/xml_import-Buffers-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-buffers-dropbox/xml_import-Buffers-dropbox-v2.py deleted file mode 100644 index f5bb21c5cc0f1964119d4f22e23d53d1f9af0f56..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-buffers-dropbox/xml_import-Buffers-dropbox-v2.py +++ /dev/null @@ -1,432 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME="name" -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -NAME_LABEL="name" -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -medias_list=[] -medias_concentration_list=[] - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - - chemicals_found = False - for child in root.getchildren(): - if child.tag == 'Chemicals': - chemicals_found = True - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_concentration=token[1] - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - chemical_name=token - chemical_concentration = "n.a." - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - node.text = "n.a." - return chemicals_list, concentration_list - - Chemicals() - if not chemicals_found: - chemicals= None - chemical_name = None - chemical_concentration = None - chemicals_list = None - concentration_list = None - - - - buffers_found = False - for child in root.getchildren(): - if child.tag == 'Solutions_Buffers': - buffers_found = True - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_concentration=token[1] - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - buffer_name=token - buffer_concentration = "n.a." - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - node.text = "n.a." - return buffers_list, buffers_concentration_list - - Buffers() - if not chemicals_found: - buffers= None - buffer_name = None - buffer_concentration = None - buffers_list = None - buffers_concentration_list = None - - - medias_found = False - for child in root.getchildren(): - if child.tag == 'Media': - medias_found = True - def Medias(): - for path in [ './Media']: - node = tree.find(path) - if node.text is not None: - medias = node.text - tokens = medias.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - media_name = token[0] - media_concentration=token[1] - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - media_name=token - media_concentration = "n.a." - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - node.text = "n.a." - return medias_list, medias_concentration_list - - Medias() - if not medias_found: - medias= None - media_name = None - media_concentration = None - medias_list = None - medias_concentration_list = None - - - - - xmlcomments_found = False - for child in root.getchildren(): - if child.tag == 'XMLCOMMENTS': - xmlcomments_found = True - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - if not xmlcomments_found: - comment_text_list = None - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, concentration_list): - elements = [] - input = chemicals_list - input2 = concentration_list - if input != "": - for i, j in zip(chemicals_list,concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - print "Buffer Name is:", name - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffers_concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_concentration_list): - elements = [] - input = buffers_list - input2 = buffers_concentration_list - if input != "": - for i, j in zip(buffers_list,buffers_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createMediasLink(medias_list, medias_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if medias_list is not None: - mediasPath= "/YEAST_LAB/" + medias_list - permId =transaction.getSample(mediasPath).getSample().getPermId() - if not permId: - permId = medias_list - name = transaction.getSample(mediasPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, medias_concentration_list) - - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateMediasFromBatchInput(medias_list, medias_concentration_list): - elements = [] - input = medias_list - input2 = medias_concentration_list - if input != "": - for i, j in zip(medias_list,medias_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createMediasLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - print "comments", comment_text_list - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'SOLUTIONS_BUFFERS') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set medias, chemicals, buffers as parents for the sample""" - - mediaId_list =[] - if medias_list != None: - for media in medias_list: - mediaIdentifier = "/YEAST_LAB/" + media.strip() - mediaId_list.append(mediaIdentifier) - - chemicalId_list =[] - if chemicals_list != None: - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - if buffers_list !=None: - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - parents_list = mediaId_list + chemicalId_list + bufferId_list - newSample.setParentSampleIdentifiers(parents_list) - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,concentration_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_concentration_list)) - if child.tag == "Media": - newSample.setPropertyValue("Media",updateMediasFromBatchInput(medias_list,medias_concentration_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Media": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-dropbox/plugin.properties deleted file mode 100644 index 21550a061b9ba25aa94bdf870c9de221ef600480..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-dropbox/plugin.properties +++ /dev/null @@ -1,16 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-Yeasts-dropbox-plasmidParents-v2.py -#script-path = xml_import-Yeasts-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-plasmidParents-v2.py b/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-plasmidParents-v2.py deleted file mode 100644 index c448780cabc94654d844221f0ab86fdbb7c42ddc..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-plasmidParents-v2.py +++ /dev/null @@ -1,495 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" - - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - - -print "########################################################" -tz=localtime()[3]-gmtime()[3] -d=datetime.now() -print d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -ATR_NAME="name" -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - -NAME_LABEL='name' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -CONNECTION_LABEL = "connection" -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -medias_list=[] -medias_concentration_list=[] -relationship_list=[] -plasmids_list=[] -annotation_list=[] -sampleLink_list=[] -####FOR PLASMID PARENTS CODE: - -"""input pattern matching one plasmid, e.g.: -- 'FRP1 (DEL:URA3)', -- 'FRP2 (INT)', -- 'FRP3(MOD:URA3)', -- 'FRP4' -""" -INPUT_PATTERN = """ - # no '^': allow whitespace at the beginning - ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') - (\ *\( # start of 2nd group (matches an optional relationship type with annotation) - # any spaces followed by a '(' - ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') - :? # optional ':' separator - (.*) # 4th group: match annotation, any text (e.g. 'URA3') - \))? # end of 2nd (optional) group: closing bracket of relationship details - # no '$': allow whitespace at the end -""" - -""" due to some weird jython threading issue, we need to compile the pattern outside the function body """ -inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) - -"""relationship types shortcuts""" - -DEL_REL_TYPE = 'DEL' -INT_REL_TYPE = 'INT' -MOD_REL_TYPE = 'MOD' - -"""tuple of supported relationship types as shortcuts""" -REL_TYPES = (DEL_REL_TYPE, INT_REL_TYPE, MOD_REL_TYPE) -"""dictionary from relationship type shortcut to its 'character' representation""" -REL_TYPE_CHARS = { - DEL_REL_TYPE: u'\u0394', # unicode '∆' -# DEL_REL_TYPE: 'D', - INT_REL_TYPE: '::', - MOD_REL_TYPE: '_' -} -"""dictionary from relationship type shortcut to its full name/label""" -REL_TYPE_LABELS = { - DEL_REL_TYPE: 'deletion', - INT_REL_TYPE: 'integration', - MOD_REL_TYPE: 'modification' -} - -REL_TYPE_LABEL_OTHER = '(other)' -REL_TYPE_LABELS_WITH_NONE = tuple([REL_TYPE_LABEL_OTHER] + REL_TYPE_LABELS.values()) - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - yeast_parents_found = False - for child in root.getchildren(): - if child.tag == 'Yeast_Parents': - pombe_parents_found = True - for path in [ './Yeast_Parents']: - node = tree.find(path) - if node.text != "": - yeast_parents = node.text - else: - node.text = "" - if not yeast_parents_found: - yeast_parents = None - - plasmids="" - - - plasmids_found = False - for child in root.getchildren(): - if child.tag == 'Plasmids': - plasmids_found = True - def Plasmids(): - for path in [ './Plasmids']: - node = tree.find(path) - if node.text is not None: - plasmids = node.text - relationship_list=[] - annotation_list =[] - plasmids_list=[] - tokens = plasmids.split(',') - for token in tokens: - if re.search(':', token): - token = token.split(':') - plasmid_name = token[0][:-4] - plasmid_relationship= token[0][-3:] - plasmid_annotation=token[1][:-1] - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - plasmid_name=token - plasmid_relationship = "" - plasmid_annotation ="" - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - plasmids= None - plasmid_name=None - plasmid_relationship = None - plasmid_annotation =None - plasmids_list=None - relationship_list=None - annotation_list=None - - return plasmids, plasmids_list, relationship_list, annotation_list - Plasmids() - plasmids=Plasmids()[0] - if not plasmids_found: - plasmids= None - plasmid_name=None - plasmid_relationship = None - plasmid_annotation =None - plasmids_list=None - relationship_list=None - annotation_list=None - - - - - xmlcomments_found = False - for child in root.getchildren(): - if child.tag == 'XMLCOMMENTS': - xmlcomments_found = True - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - if not xmlcomments_found: - comment_text_list = None - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - -### IMPORT YEAST PARENTS############################################################## - - def _createYeastSampleLink(yeast_parents): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if yeast_parents is not None: - YPpath= "/YEAST_LAB/" + yeast_parents - permId =transaction.getSample(YPpath).getSample().getPermId() - if not permId: - permId = yeast_parents - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, yeast_parents) - return sampleLink - - - """ - Example input: - - FRY1, FRY2, FRY3, FRY4 - """ - def updateYeastFromBatchInput(yeast_parents): - elements = [] - input = yeast_parents - if input is not None: - samples = input.split(',') - for yeast_parents in samples: - sampleLink = _createYeastSampleLink(yeast_parents.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - - def _getYeastCode(yeast_parents): - elements = [] - input = yeast_parents - if input is not None: - samples = input.split(',') - for yeast_parents in samples: - yeastPath= "/YEAST_LAB/" + yeast_parents.strip() - elements.append(yeastPath) - return elements - - - - -###IMPORT PLASMID PARENTS####################################################### - - def _group(pattern, input): - """@return: groups returned by performing pattern search with given @pattern on given @input""" - return pattern.search(input).groups() - - - def _translateToChar(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: character representation of given @relationship, - empty string for null - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_CHARS: - return REL_TYPE_CHARS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return "" - - - def _translateToLabel(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: full name of given @relationship, - empty string for null, - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_LABELS: - return REL_TYPE_LABELS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return REL_TYPE_LABEL_OTHER - - def _translateFromLabel(relationshipLabel): - """ - @param relationshipLabel: relationship type as label (@see REL_TYPE_LABELS_WITH_NONE) - @return: type of given @relationshipLabel, None for REL_TYPE_LABEL_OTHER, - """ - if relationshipLabel == REL_TYPE_LABEL_OTHER: - return None - elif relationshipLabel == 'deletion': - return DEL_REL_TYPE - elif relationshipLabel == 'integration': - return INT_REL_TYPE - elif relationshipLabel == 'modification': - return MOD_REL_TYPE - - def _createConnectionString(plasmids_list, relationship_list, annotation_list): - """ - @param plasmids: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: string representation of a connection with @relationship translated to a 'character' - """ - result = plasmids_list - if relationship_list: - result += _translateToChar(relationship_list) - if annotation_list: - result += annotation_list - return result - - - def _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list): - """ - Creates sample link XML element for sample with specified @code. The element will contain - given @code as 'code' attribute apart from standard 'permId' attribute. If specified - @relationship or @annotation are not null they will also be contained as attributes. - - If the sample doesn't exist in DB a fake link will be created with @code as permId. - - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FRP2" permId="20110309154532868-4219" relationship="DEL" annotation="URA3"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - - '<Sample code="FRP4" permId="20110309154532868-4219" relationship="INT"/>' - @raise Exception: if the specified relationship type is unknown - """ - if plasmids is not None: - plasmidPath= "/YEAST_LAB/" + plasmids_list.strip() - permId =transaction.getSample(plasmidPath).getSample().getPermId() - if not permId: - permId = plasmids_list - sampleLink = elementFactory.createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, plasmids_list) - if relationship_list: - sampleLink.addAttribute(ATR_RELATIONSHIP, relationship_list) - if relationship_list in REL_TYPES: - connectionString = _createConnectionString(plasmids_list, relationship_list, annotation_list) - else: - raise ValidationException("Unknown relationship: '" + relationship_list + - "'. Expected one of: " + REL_TYPES) - if annotation_list: - sampleLink.addAttribute(ATR_ANNOTATION, annotation_list) - return sampleLink - - """ MAIN FUNCTIONS """ - - """Example input: - - FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 - - Relationship types: - - DEL: deletion - - INT: integration - - MOD: modification - """ - - def updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list): - elements = [] - input = plasmids - if input is not None: - plas = input.split(',') - for p in plas: - (plasmids_list, g, relationship_list, annotation_list) = _group(inputPattern, p.strip()) - sampleLink = _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list) - elements.append(sampleLink) - - parentsInput = yeast_parents - if parentsInput is not None: - parents = parentsInput.split(',') - for parent in parents: - YeastPath= "/YEAST_LAB/" + parent.strip() - print "Yeast Path", YeastPath - parentPlasmids = transaction.getSample(YeastPath).getPropertyValue('PLASMIDS') - - if parentPlasmids is " ": - print "None:", parentPlasmids - continue - parentElements = list(propertyConverter.convertStringToElements(parentPlasmids)) - print "pele", parentElements - for parentLink in parentElements: - elements.append(parentLink) - - return propertyConverter.convertToString(elements) - - - updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list) - - - def _getPlasmidCode(plasmids_list): - elements = [] - input = plasmids_list - if input is not None: - for i in plasmids_list: - plasmidPath= "/YEAST_LAB/" + i.strip() - elements.append(plasmidPath) - return elements - - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'YEAST') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - parents = _getPlasmidCode(plasmids_list) + _getYeastCode(yeast_parents) - print "parents =", parents - newSample.setParentSampleIdentifiers(parents) - - for child in root: - if child.tag == "Yeast_Parents": - newSample.setPropertyValue("YEAST_PARENTS", updateYeastFromBatchInput(yeast_parents)) - if child.tag == "Plasmids": - newSample.setPropertyValue("PLASMIDS",updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Yeast_Parents" and child.tag != "Plasmids" and child.tag != "XMLCOMMENTS": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-v2.py deleted file mode 100644 index 968701392a4c19cd05e93ea6327c2f0cc97ca772..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-dropbox/xml_import-Yeasts-dropbox-v2.py +++ /dev/null @@ -1,496 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" - - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - - -print "########################################################" -tz=localtime()[3]-gmtime()[3] -d=datetime.now() -print d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - - -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - - -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -medias_list=[] -medias_concentration_list=[] - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - for path in [ './Yeast_Parents']: - node = tree.find(path) - if node.text != "": - yeast_parents = node.text - else: - node.text = "" - - - for path in [ './Plasmids']: - node = tree.find(path) - if node.text != "": - plasmids = node.text - else: - node.text = "" - - - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_concentration=token[1] - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - chemical_name=token - chemical_concentration = "n.a." - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - node.text = "n.a." - return chemicals_list, concentration_list - - Chemicals() - - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_concentration=token[1] - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - buffer_name=token - buffer_concentration = "n.a." - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - node.text = "n.a." - return buffers_list, buffers_concentration_list - - Buffers() - - def Medias(): - for path in [ './Media']: - node = tree.find(path) - if node.text is not None: - medias = node.text - tokens = medias.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - media_name = token[0] - media_concentration=token[1] - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - media_name=token - media_concentration = "n.a." - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - node.text = "n.a." - return medias_list, medias_concentration_list - - Medias() - - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - -### IMPORT YEAST PARENTS############################################################## - - def _createYeastSampleLink(yeast_parents): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if yeast_parents is not None: - YPpath= "/YEAST_LAB/" + yeast_parents - permId =transaction.getSample(YPpath).getSample().getPermId() - if not permId: - permId = yeast_parents - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, yeast_parents) - return sampleLink - - - """ - Example input: - - FRY1, FRY2, FRY3, FRY4 - """ - def updateYeastFromBatchInput(yeast_parents): - elements = [] - input = yeast_parents - if input is not None: - samples = input.split(',') - for yeast_parents in samples: - sampleLink = _createYeastSampleLink(yeast_parents.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - - def _getYeastCode(yeast_parents): - elements = [] - input = yeast_parents - if input is not None: - samples = input.split(',') - for yeast_parents in samples: - yeastPath= "/YEAST_LAB/" + yeast_parents.strip() - elements.append(yeastPath) - return elements - - - - -###IMPORT PLASMID PARENTS####################################################### - - def _createPlasmidSampleLink(plasmids): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if plasmids is not None: - plasmidPath= "/YEAST_LAB/" + plasmids - permId =transaction.getSample(plasmidPath).getSample().getPermId() - if not permId: - permId = plasmids - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, plasmids) - return sampleLink - - - """ - Example input: - - FRP1, FRP2, FRP3, FRP4 - """ - def updatePlasmidFromBatchInput(plasmids): - elements = [] - input = plasmids - if input is not None: - samples = input.split(',') - for plasmids in samples: - sampleLink = _createPlasmidSampleLink(plasmids.strip()) - elements.append(sampleLink) - - return propertyConverter.convertToString(elements) - - - def _getPlasmidCode(plasmids): - elements = [] - input = plasmids - if input is not None: - samples = input.split(',') - for plasmids in samples: - plasmidPath= "/YEAST_LAB/" + plasmids.strip() - elements.append(plasmidPath) - - return elements - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - print chemicalPath - permId =transaction.getSample(chemicalPath).getSample().getPermId() - print "chemical permid", permId - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, concentration_list): - elements = [] - input = chemicals_list - input2 = concentration_list - if input != "": - for i, j in zip(chemicals_list,concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - print "buff path", buffersPath - permId =transaction.getSample(buffersPath).getSample().getPermId() - print "buff permid", permId - if not permId: - permId = buffers_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_CONC, buffers_concentration_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_concentration_list): - elements = [] - input = buffers_list - input2 = buffers_concentration_list - if input != "": - for i, j in zip(buffers_list,buffers_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createMediasLink(medias_list, medias_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if medias_list is not None: - mediasPath= "/YEAST_LAB/" + medias_list - permId =transaction.getSample(mediasPath).getSample().getPermId() - if not permId: - permId = medias_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_CONC, medias_concentration_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateMediasFromBatchInput(medias_list, medias_concentration_list): - elements = [] - input = medias_list - input2 = medias_concentration_list - if input != "": - for i, j in zip(medias_list,medias_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createMediasLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'YEAST') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - parents = _getPlasmidCode(plasmids) + _getYeastCode(yeast_parents) - - - for child in root: - if child.tag == "Yeast_Parents": - newSample.setPropertyValue("YEAST_PARENTS", updateYeastFromBatchInput(yeast_parents)) - if child.tag == "Plasmids": - newSample.setPropertyValue("PLASMIDS",updatePlasmidFromBatchInput(plasmids)) - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,concentration_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_concentration_list)) - if child.tag == "Media": - newSample.setPropertyValue("Media",updateMediasFromBatchInput(medias_list,medias_concentration_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Yeast_Parents" and child.tag != "Plasmids" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Media": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-media-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-media-dropbox/plugin.properties deleted file mode 100644 index 4177a193e14560d483f0db04eed86081c6156df8..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-media-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-media-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-Media-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-media-dropbox/xml_import-Media-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-media-dropbox/xml_import-Media-dropbox-v2.py deleted file mode 100644 index ebf5b6823e84a09767181b19a9e72b88d96aabbb..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-media-dropbox/xml_import-Media-dropbox-v2.py +++ /dev/null @@ -1,433 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME="name" -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -NAME_LABEL='name' -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -medias_list=[] -medias_concentration_list=[] - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - -###PARSE XML FILE############################################################ - - print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - print experiment_name - - chemicals_found = False - for child in root.getchildren(): - if child.tag == 'Chemicals': - chemicals_found = True - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_concentration=token[1] - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - chemical_name=token - chemical_concentration = "n.a." - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - node.text = "n.a." - return chemicals_list, concentration_list - - Chemicals() - if not chemicals_found: - chemicals= None - chemical_name = None - chemical_concentration = None - chemicals_list = None - concentration_list = None - - - - buffers_found = False - for child in root.getchildren(): - if child.tag == 'Solutions_Buffers': - buffers_found = True - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_concentration=token[1] - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - buffer_name=token - buffer_concentration = "n.a." - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - node.text = "n.a." - return buffers_list, buffers_concentration_list - - Buffers() - if not chemicals_found: - buffers= None - buffer_name = None - buffer_concentration = None - buffers_list = None - buffers_concentration_list = None - - - medias_found = False - for child in root.getchildren(): - if child.tag == 'Media': - medias_found = True - def Medias(): - for path in [ './Media']: - node = tree.find(path) - if node.text is not None: - medias = node.text - tokens = medias.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - media_name = token[0] - media_concentration=token[1] - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - media_name=token - media_concentration = "n.a." - medias_list.append(media_name) - medias_concentration_list.append(media_concentration) - else: - node.text = "n.a." - return medias_list, medias_concentration_list - - Medias() - if not medias_found: - medias= None - media_name = None - media_concentration = None - medias_list = None - medias_concentration_list = None - - - - - xmlcomments_found = False - for child in root.getchildren(): - if child.tag == 'XMLCOMMENTS': - xmlcomments_found = True - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - if not xmlcomments_found: - comment_text_list = None - - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, concentration_list): - elements = [] - input = chemicals_list - input2 = concentration_list - if input != "": - for i, j in zip(chemicals_list,concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffers_concentration_list) - - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_concentration_list): - elements = [] - input = buffers_list - input2 = buffers_concentration_list - if input != "": - for i, j in zip(buffers_list,buffers_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createMediasLink(medias_list, medias_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if medias_list is not None: - mediasPath= "/YEAST_LAB/" + medias_list - permId =transaction.getSample(mediasPath).getSample().getPermId() - if not permId: - permId = medias_list - name = transaction.getSample(mediasPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, medias_concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateMediasFromBatchInput(medias_list, medias_concentration_list): - elements = [] - input = medias_list - input2 = medias_concentration_list - if input != "": - for i, j in zip(medias_list,medias_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createMediasLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - print "comments", comment_text_list - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'MEDIA') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set medias, chemicals, buffers as parents for the sample""" - - mediaId_list =[] - if medias_list != None: - for media in medias_list: - mediaIdentifier = "/YEAST_LAB/" + media.strip() - mediaId_list.append(mediaIdentifier) - - chemicalId_list =[] - if chemicals_list != None: - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - if buffers_list !=None: - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - parents_list = mediaId_list + chemicalId_list + bufferId_list - newSample.setParentSampleIdentifiers(parents_list) - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,concentration_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_concentration_list)) - if child.tag == "Media": - newSample.setPropertyValue("Media",updateMediasFromBatchInput(medias_list,medias_concentration_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Media": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-pcr-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-pcr-dropbox/plugin.properties deleted file mode 100644 index a889654300e00b523811de4a77e0d1fa95ec6dee..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-pcr-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-pcr-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-pcr-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-pcr-dropbox/xml_import-pcr-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-pcr-dropbox/xml_import-pcr-dropbox-v2.py deleted file mode 100644 index db8c23079eb72a61763a55e7a74b16e665a84448..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-pcr-dropbox/xml_import-pcr-dropbox-v2.py +++ /dev/null @@ -1,386 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME='name' -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' -NAME_LABEL='name' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -enzymes_list=[] - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - - - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_concentration=token[1] - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - chemical_name=token - chemical_concentration = "n.a." - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - node.text = "n.a." - print "CHEM", chemicals_list, concentration_list - return chemicals_list, concentration_list - - Chemicals() - - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_concentration=token[1] - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - buffer_name=token - buffer_concentration = "n.a." - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - node.text = "n.a." - print "BUFF", buffers_list, buffers_concentration_list - return buffers_list, buffers_concentration_list - - Buffers() - - def Enzymes(): - for path in [ './Enzymes']: - node = tree.find(path) - if node.text is not None: - enzymes = node.text - tokens = enzymes.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - enzyme_name = token[0] - enzyme_concentration=token[1] - enzymes_list.append(enzyme_name) - else: - enzyme_name=token - enzyme_concentration = "n.a." - enzymes_list.append(enzyme_name) - else: - node.text = "n.a." - print "ANTIBODY", enzymes_list - return enzymes_list - - Enzymes() - - - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, concentration_list): - elements = [] - input = chemicals_list - input2 = concentration_list - if input != "": - for i, j in zip(chemicals_list,concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffers_concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_concentration_list): - elements = [] - input = buffers_list - input2 = buffers_concentration_list - if input != "": - for i, j in zip(buffers_list,buffers_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createEnzymesLink(enzymes_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if enzymes_list is not None: - enzymesPath= "/YEAST_LAB/" + enzymes_list - permId =transaction.getSample(enzymesPath).getSample().getPermId() - if not permId: - permId = enzymes_list - name = transaction.getSample(enzymesPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, enzymes_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateEnzymesFromBatchInput(enzymes_list): - elements = [] - input = enzymes_list - if input != "": - for i in enzymes_list: - sampleLink = _createEnzymesLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - print "comments", comment_text_list - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'PCR') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set enzymes, chemicals, buffers as parents for the sample""" - - enzymeId_list =[] - for enzyme in enzymes_list: - enzymeIdentifier = "/YEAST_LAB/" + enzyme.strip() - enzymeId_list.append(enzymeIdentifier) - - chemicalId_list =[] - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - parents_list = enzymeId_list + chemicalId_list + bufferId_list - newSample.setParentSampleIdentifiers(parents_list) - - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,concentration_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_concentration_list)) - if child.tag == "Enzymes": - newSample.setPropertyValue("Enzymes",updateEnzymesFromBatchInput(enzymes_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Enzymes": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-pombe-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-pombe-dropbox/plugin.properties deleted file mode 100644 index ab6c643d23b97c6befead43b319c6c061808b39f..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-pombe-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-pombe-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-Pombe-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2-num1.py b/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2-num1.py deleted file mode 100644 index eaadc9601ad51a27ad4011f92381871ee7be58d2..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2-num1.py +++ /dev/null @@ -1,476 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" - - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - - -print "########################################################" -tz=localtime()[3]-gmtime()[3] -d=datetime.now() -print d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -ATR_NAME="name" -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - -NAME_LABEL='name' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -CONNECTION_LABEL = "connection" -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - -pombe_parents_list=[] -date_list=[] -person_list=[] -comment_text_list=[] -relationship_list=[] -plasmids_list=[] -annotation_list=[] -sampleLink_list=[] -####FOR PLASMID PARENTS CODE: - -"""input pattern matching one plasmid, e.g.: -- 'FRP1 (DEL:URA3)', -- 'FRP2 (INT)', -- 'FRP3(MOD:URA3)', -- 'FRP4' -""" -INPUT_PATTERN = """ - # no '^': allow whitespace at the beginning - ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') - (\ *\( # start of 2nd group (matches an optional relationship type with annotation) - # any spaces followed by a '(' - ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') - :? # optional ':' separator - (.*) # 4th group: match annotation, any text (e.g. 'URA3') - \))? # end of 2nd (optional) group: closing bracket of relationship details - # no '$': allow whitespace at the end -""" - -""" due to some weird jython threading issue, we need to compile the pattern outside the function body """ -inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) - -"""relationship types shortcuts""" - -DEL_REL_TYPE = 'DEL' -INT_REL_TYPE = 'INT' -MOD_REL_TYPE = 'MOD' - -"""tuple of supported relationship types as shortcuts""" -REL_TYPES = (DEL_REL_TYPE, INT_REL_TYPE, MOD_REL_TYPE) -"""dictionary from relationship type shortcut to its 'character' representation""" -REL_TYPE_CHARS = { - DEL_REL_TYPE: u'\u0394', # unicode '∆' -# DEL_REL_TYPE: 'D', - INT_REL_TYPE: '::', - MOD_REL_TYPE: '_' -} -"""dictionary from relationship type shortcut to its full name/label""" -REL_TYPE_LABELS = { - DEL_REL_TYPE: 'deletion', - INT_REL_TYPE: 'integration', - MOD_REL_TYPE: 'modification' -} - -REL_TYPE_LABEL_OTHER = '(other)' -REL_TYPE_LABELS_WITH_NONE = tuple([REL_TYPE_LABEL_OTHER] + REL_TYPE_LABELS.values()) - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - # for path in [ './Yeast_Parents']: - # node = tree.find(path) - # if node.text != "": - # yeast_parents = node.text - # else: - # node.text = "" - - for path in [ './Plasmids']: - node = tree.find(path) - if node.text != "": - plasmids= node.text - else: - node.text = "" - - - def Plasmids(): - for path in [ './Plasmids']: - node = tree.find(path) - if node.text is not None: - plasmids = node.text - tokens = plasmids.split(',') - for token in tokens: - if re.search(':', token): - token = token.split(':') - plasmid_name = token[0][:-4] - plasmid_relationship= token[0][-3:] - plasmid_annotation=token[1][:-1] - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - plasmid_name=token - plasmid_relationship = "" - plasmid_annotation ="" - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - node.text = "" - return plasmids, plasmids_list, relationship_list, annotation_list - - Plasmids() - - def PombeParents(): - for path in [ './Pombe_Parents']: - node = tree.find(path) - if node.text is not None: - pombe_parents = node.text - tokens = pombe_parents.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - pombe_name = token[0] - pombe_parents_list.append(pombe_name) - else: - pombe_name=token - pombe_concentration = "n.a." - pombe_parents_list.append(pombe_name) - else: - node.text = "n.a." - return pombe_parents - - PombeParents() - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - - -###IMPORT POMBE PARENTS#################################################################### - - - def _createpombe_parentsSampleLink(pombe_parents_list): - - if pombe_parents_list is not None: - pombePath= "/YEAST_LAB/" + pombe_parents_list - permId =transaction.getSample(pombePath).getSample().getPermId() - name = transaction.getSample(pombePath).getPropertyValue("NAME") - if not permId: - permId = pombe_parents_list - sampleLink = elementFactory.createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, pombe_parents_list) - sampleLink.addAttribute(ATR_NAME, name) - - - return sampleLink - - - """ - Example input: - - FRSP1, FRSP2 - """ - - - def updatepombe_parentsFromBatchInput(pombe_parents_list): - elements = [] - input = pombe_parents_list - if input != "": - for i in pombe_parents_list: - sampleLink = _createpombe_parentsSampleLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - def _getPombeCode(pombe_parents_list): - elements = [] - input = pombe_parents_list - if input is not None: - samples = input.split(',') - for pombe_parents_list in samples: - ParentsPath= "/YEAST_LAB/" + pombe_parents_list.strip() - elements.append(ParentsPath) - return elements - - -###IMPORT PLASMID PARENTS####################################################### - - def _group(pattern, input): - """@return: groups returned by performing pattern search with given @pattern on given @input""" - return pattern.search(input).groups() - - - def _translateToChar(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: character representation of given @relationship, - empty string for null - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_CHARS: - return REL_TYPE_CHARS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return "" - - - def _translateToLabel(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: full name of given @relationship, - empty string for null, - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_LABELS: - return REL_TYPE_LABELS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return REL_TYPE_LABEL_OTHER - - def _translateFromLabel(relationshipLabel): - """ - @param relationshipLabel: relationship type as label (@see REL_TYPE_LABELS_WITH_NONE) - @return: type of given @relationshipLabel, None for REL_TYPE_LABEL_OTHER, - """ - if relationshipLabel == REL_TYPE_LABEL_OTHER: - return None - elif relationshipLabel == 'deletion': - return DEL_REL_TYPE - elif relationshipLabel == 'integration': - return INT_REL_TYPE - elif relationshipLabel == 'modification': - return MOD_REL_TYPE - - def _createConnectionString(plasmids_list, relationship_list, annotation_list): - """ - @param plasmids: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: string representation of a connection with @relationship translated to a 'character' - """ - result = plasmids_list - if relationship_list: - result += _translateToChar(relationship_list) - if annotation_list: - result += annotation_list - return result - - - def _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list): - """ - Creates sample link XML element for sample with specified @code. The element will contain - given @code as 'code' attribute apart from standard 'permId' attribute. If specified - @relationship or @annotation are not null they will also be contained as attributes. - - If the sample doesn't exist in DB a fake link will be created with @code as permId. - - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FRP2" permId="20110309154532868-4219" relationship="DEL" annotation="URA3"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - - '<Sample code="FRP4" permId="20110309154532868-4219" relationship="INT"/>' - @raise Exception: if the specified relationship type is unknown - """ - if plasmids is not None: - plasmidPath= "/YEAST_LAB/" + plasmids_list.strip() - permId =transaction.getSample(plasmidPath).getSample().getPermId() - if not permId: - permId = plasmids_list - sampleLink = elementFactory.createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, plasmids_list) - if relationship_list: - sampleLink.addAttribute(ATR_RELATIONSHIP, relationship_list) - if relationship_list in REL_TYPES: - connectionString = _createConnectionString(plasmids_list, relationship_list, annotation_list) - else: - raise ValidationException("Unknown relationship: '" + relationship_list + - "'. Expected one of: " + REL_TYPES) - if annotation_list: - sampleLink.addAttribute(ATR_ANNOTATION, annotation_list) - return sampleLink - - """ MAIN FUNCTIONS """ - - """Example input: - - FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 - - Relationship types: - - DEL: deletion - - INT: integration - - MOD: modification - """ - - def updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list): - elements = [] - input = plasmids - if input is not None: - plas = input.split(',') - for p in plas: - (plasmids_list, g, relationship_list, annotation_list) = _group(inputPattern, p.strip()) - sampleLink = _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list) - elements.append(sampleLink) - - parentsInput = pombe_parents_list - if parentsInput is not None: - parents = parentsInput.split(',') - for parent in parents: - ParentsPath= "/YEAST_LAB/" + parent.strip() - parentPlasmids = transaction.getSample(ParentsPath).getPropertyValue('PLASMIDS') - - if parentPlasmids is " ": - print "None:", parentPlasmids - continue - parentElements = list(propertyConverter.convertStringToElements(parentPlasmids)) - print "pele", parentElements - for parentLink in parentElements: - elements.append(parentLink) - - return propertyConverter.convertToString(elements) - - - updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list) - - - def _getPlasmidCode(plasmids_list): - elements = [] - input = plasmids_list - if input is not None: - for i in plasmids_list: - plasmidPath= "/YEAST_LAB/" + i.strip() - elements.append(plasmidPath) - return elements - - - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'POMBE') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - parents = _getPlasmidCode(plasmids_list) + _getPombeCode(pombe_parents_list) - print "parents =", parents - newSample.setParentSampleIdentifiers(parents) - - for child in root: - if child.tag == "Plasmids": - newSample.setPropertyValue("PLASMIDS",updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list)) - if child.tag == "Pombe_Parents": - newSample.setPropertyValue("POMBE-PARENTS",updatepombe_parentsFromBatchInput(pombe_parents_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Pombe_Parents" and child.tag != "Plasmids" and child.tag != "XMLCOMMENTS": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2.py deleted file mode 100644 index 52b60fc6c119e2b39c9ae177044ce35e7231d00e..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-pombe-dropbox/xml_import-Pombe-dropbox-v2.py +++ /dev/null @@ -1,476 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" - - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - - -print "########################################################" -tz=localtime()[3]-gmtime()[3] -d=datetime.now() -print d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -ATR_NAME="name" -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -ATR_RELATIONSHIP = "rel" -ATR_ANNOTATION = "annotation" - -NAME_LABEL='name' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -CONNECTION_LABEL = "connection" -LINK_LABEL = "link" -CODE_LABEL = "code" -RELATIONSHIP_LABEL = "relationship" -ANNOTATION_LABEL = "annotation" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' - - -date_list=[] -person_list=[] -comment_text_list=[] -relationship_list=[] -annotation_list =[] -plasmids_list=[] -sampleLink_list=[] - -####FOR PLASMID PARENTS CODE: - -"""input pattern matching one plasmid, e.g.: -- 'FRP1 (DEL:URA3)', -- 'FRP2 (INT)', -- 'FRP3(MOD:URA3)', -- 'FRP4' -""" -INPUT_PATTERN = """ - # no '^': allow whitespace at the beginning - ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') - (\ *\( # start of 2nd group (matches an optional relationship type with annotation) - # any spaces followed by a '(' - ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') - :? # optional ':' separator - (.*) # 4th group: match annotation, any text (e.g. 'URA3') - \))? # end of 2nd (optional) group: closing bracket of relationship details - # no '$': allow whitespace at the end -""" - -""" due to some weird jython threading issue, we need to compile the pattern outside the function body """ -inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) - -"""relationship types shortcuts""" - -DEL_REL_TYPE = 'DEL' -INT_REL_TYPE = 'INT' -MOD_REL_TYPE = 'MOD' - -"""tuple of supported relationship types as shortcuts""" -REL_TYPES = (DEL_REL_TYPE, INT_REL_TYPE, MOD_REL_TYPE) -"""dictionary from relationship type shortcut to its 'character' representation""" -REL_TYPE_CHARS = { - DEL_REL_TYPE: u'\u0394', # unicode '∆' -# DEL_REL_TYPE: 'D', - INT_REL_TYPE: '::', - MOD_REL_TYPE: '_' -} -"""dictionary from relationship type shortcut to its full name/label""" -REL_TYPE_LABELS = { - DEL_REL_TYPE: 'deletion', - INT_REL_TYPE: 'integration', - MOD_REL_TYPE: 'modification' -} - -REL_TYPE_LABEL_OTHER = '(other)' -REL_TYPE_LABELS_WITH_NONE = tuple([REL_TYPE_LABEL_OTHER] + REL_TYPE_LABELS.values()) - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - for path in [ './Pombe_Parents']: - node = tree.find(path) - if node.text != "": - pombe_parents = node.text - else: - node.text = "" - - - plasmids="" - - def Plasmids(): - for path in [ './Plasmids']: - node = tree.find(path) - if node.text is not None: - plasmids = node.text - relationship_list=[] - annotation_list =[] - plasmids_list=[] - tokens = plasmids.split(',') - for token in tokens: - print "token", token - if re.search(':', token): - token = token.split(':') - plasmid_name = token[0][:-4] - plasmid_relationship= token[0][-3:] - plasmid_annotation=token[1][:-1] - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - plasmid_name=token - plasmid_relationship = "" - plasmid_annotation ="" - plasmids_list.append(plasmid_name) - relationship_list.append(plasmid_relationship) - annotation_list.append(plasmid_annotation) - else: - plasmids= None - plasmid_name=None - plasmid_relationship = None - plasmid_annotation =None - plasmids_list=None - relationship_list=None - annotation_list=None - - return plasmids, plasmids_list, relationship_list, annotation_list - - Plasmids() - - plasmids=Plasmids()[0] - - - - print "plasmids function", Plasmids()[1] - - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - -### IMPORT YEAST PARENTS############################################################## - - def _createPombeSampleLink(pombe_parents): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if pombe_parents is not None: - YPpath= "/YEAST_LAB/" + pombe_parents - permId =transaction.getSample(YPpath).getSample().getPermId() - if not permId: - permId = pombe_parents - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, pombe_parents) - return sampleLink - - - """ - Example input: - - FRY1, FRY2, FRY3, FRY4 - """ - def updatePombeFromBatchInput(pombe_parents): - elements = [] - input = pombe_parents - if input is not None: - samples = input.split(',') - for pombe_parents in samples: - sampleLink = _createPombeSampleLink(pombe_parents.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - - def _getPombeCode(pombe_parents): - elements = [] - input = pombe_parents - if input is not None: - samples = input.split(',') - for pombe_parents in samples: - pombePath= "/YEAST_LAB/" + pombe_parents.strip() - elements.append(pombePath) - return elements - - - - -###IMPORT PLASMID PARENTS####################################################### - - def _group(pattern, input): - """@return: groups returned by performing pattern search with given @pattern on given @input""" - return pattern.search(input).groups() - - - def _translateToChar(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: character representation of given @relationship, - empty string for null - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_CHARS: - return REL_TYPE_CHARS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return "" - - - def _translateToLabel(relationship_list): - """ - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @return: full name of given @relationship, - empty string for null, - '[<relationship>]' for unknown relationship - """ - if relationship_list: - if relationship_list in REL_TYPE_LABELS: - return REL_TYPE_LABELS[relationship_list] - else: - return "[" + relationship_list + "]" - else: - return REL_TYPE_LABEL_OTHER - - def _translateFromLabel(relationshipLabel): - """ - @param relationshipLabel: relationship type as label (@see REL_TYPE_LABELS_WITH_NONE) - @return: type of given @relationshipLabel, None for REL_TYPE_LABEL_OTHER, - """ - if relationshipLabel == REL_TYPE_LABEL_OTHER: - return None - elif relationshipLabel == 'deletion': - return DEL_REL_TYPE - elif relationshipLabel == 'integration': - return INT_REL_TYPE - elif relationshipLabel == 'modification': - return MOD_REL_TYPE - - def _createConnectionString(plasmids_list, relationship_list, annotation_list): - """ - @param plasmids: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: string representation of a connection with @relationship translated to a 'character' - """ - result = plasmids_list - if relationship_list: - result += _translateToChar(relationship_list) - if annotation_list: - result += annotation_list - return result - - - def _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list): - """ - Creates sample link XML element for sample with specified @code. The element will contain - given @code as 'code' attribute apart from standard 'permId' attribute. If specified - @relationship or @annotation are not null they will also be contained as attributes. - - If the sample doesn't exist in DB a fake link will be created with @code as permId. - - @param code: code of a sample - @param relationship: relationship type as a shortcut (@see REL_TYPES), may be null - @param annotation: annotation of the relationship, may be null - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FRP2" permId="20110309154532868-4219" relationship="DEL" annotation="URA3"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - - '<Sample code="FRP4" permId="20110309154532868-4219" relationship="INT"/>' - @raise Exception: if the specified relationship type is unknown - """ - if plasmids is not None: - print "plasmids not none is", plasmids - plasmidPath= "/YEAST_LAB/" + plasmids_list.strip() - permId =transaction.getSample(plasmidPath).getSample().getPermId() - if not permId: - permId = plasmids_list - sampleLink = elementFactory.createSampleLink(permId) - sampleLink.addAttribute(ATR_CODE, plasmids_list) - if relationship_list: - sampleLink.addAttribute(ATR_RELATIONSHIP, relationship_list) - if relationship_list in REL_TYPES: - connectionString = _createConnectionString(plasmids_list, relationship_list, annotation_list) - else: - raise ValidationException("Unknown relationship: '" + relationship_list + - "'. Expected one of: " + REL_TYPES) - if annotation_list: - sampleLink.addAttribute(ATR_ANNOTATION, annotation_list) - return sampleLink - - """ MAIN FUNCTIONS """ - - """Example input: - - FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 - - Relationship types: - - DEL: deletion - - INT: integration - - MOD: modification - """ - - def updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list): - elements = [] - input = plasmids - if input is not None: - plas = input.split(',') - for p in plas: - (plasmids_list, g, relationship_list, annotation_list) = _group(inputPattern, p.strip()) - sampleLink = _createPlasmidSampleLink(plasmids_list, relationship_list, annotation_list) - elements.append(sampleLink) - - parentsInput = pombe_parents - if parentsInput is not None: - parents = parentsInput.split(',') - for parent in parents: - PombePath= "/YEAST_LAB/" + parent.strip() - print "Pombe path ", PombePath - parentPlasmids = transaction.getSample(PombePath).getPropertyValue('PLASMIDS') - - if parentPlasmids is " ": - print "None:", parentPlasmids - continue - parentElements = list(propertyConverter.convertStringToElements(parentPlasmids)) - print "pele", parentElements - for parentLink in parentElements: - elements.append(parentLink) - - return propertyConverter.convertToString(elements) - - - updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list) - - - def _getPlasmidCode(plasmids_list): - elements = [] - input = plasmids_list - if input is not None: - for i in plasmids_list: - plasmidPath= "/YEAST_LAB/" + i.strip() - elements.append(plasmidPath) - return elements - - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'POMBE') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - parents = _getPlasmidCode(plasmids_list) + _getPombeCode(pombe_parents) - print "parents =", parents - newSample.setParentSampleIdentifiers(parents) - - for child in root: - if child.tag == "Pombe_Parents": - newSample.setPropertyValue("POMBE-PARENTS", updatePombeFromBatchInput(pombe_parents)) - if child.tag == "Plasmids": - newSample.setPropertyValue("PLASMIDS",updatePlasmidFromBatchInput(plasmids_list, relationship_list, annotation_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Pombe_Parents" and child.tag != "Plasmids" and child.tag != "XMLCOMMENTS": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-readouts-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-readouts-dropbox/plugin.properties deleted file mode 100644 index afe7b0c8b8403c6180007f9eee5760b555deb266..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-readouts-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-readouts-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-readouts-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-readouts-dropbox/xml_import-readouts-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-readouts-dropbox/xml_import-readouts-dropbox-v2.py deleted file mode 100644 index fb2f8bd8c246d3ec59da57b8e61a18ca89d24cfa..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-readouts-dropbox/xml_import-readouts-dropbox-v2.py +++ /dev/null @@ -1,539 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME='name' -ATR_CODE = "code" -ATR_QUANTITY = "quantity" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -LINK_LABEL = "link" -CODE_LABEL = "code" -QUANTITY_LABEL = "quantity" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' -NAME_LABEL='name' - -chemicals_list=[] -quantity_list=[] -buffers_list=[] -buffers_quantity_list =[] -medias_list=[] -medias_quantity_list=[] -date_list=[] -person_list=[] -comment_text_list=[] -enzymes_list=[] -protocols_list=[] - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - - def Protocols(): - for path in [ './General_Protocol']: - node = tree.find(path) - if node.text is not None: - protocols = node.text - tokens = protocols.split(',') - for token in tokens: - protocols_name=token - protocols_list.append(protocols_name) - else: - node.text = "n.a." - return protocols_list - - Protocols() - - - - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_quantity=token[1] - chemicals_list.append(chemical_name) - qunatity_list.append(chemical_quantity) - else: - chemical_name=token - chemical_quantity = "n.a." - chemicals_list.append(chemical_name) - quantity_list.append(chemical_quantity) - else: - node.text = "n.a." - print "CHEM", chemicals_list, quantity_list - return chemicals_list, quantity_list - - Chemicals() - - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_quantity=token[1] - buffers_list.append(buffer_name) - buffers_quantty_list.append(buffer_quantity) - else: - buffer_name=token - buffer_quantity = "n.a." - buffers_list.append(buffer_name) - buffers_quantity_list.append(buffer_quantity) - else: - node.text = "n.a." - return buffers_list, buffers_quantity_list - - Buffers() - - def Enzymes(): - for path in [ './Enzymes']: - node = tree.find(path) - if node.text is not None: - enzymes = node.text - tokens = enzymes.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - enzyme_name = token[0] - enzyme_quantity=token[1] - enzymes_list.append(enzyme_name) - else: - enzyme_name=token - enzyme_quantity = "n.a." - enzymes_list.append(enzyme_name) - else: - node.text = "n.a." - return enzymes_list - - Enzymes() - - def Medias(): - for path in [ './Media']: - node = tree.find(path) - if node.text is not None: - medias = node.text - tokens = medias.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - media_name = token[0] - media_quantity=token[1] - medias_list.append(media_name) - medias_quantity_list.append(media_quantity) - else: - media_name=token - media_quantity = "n.a." - medias_list.append(media_name) - medias_quantity_list.append(media_quantity) - else: - node.text = "n.a." - return medias_list, medias_quantity_list - - Medias() - - - - - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - -###IMPORT PROTOCOLS#################################################################### - - - def _createProtocolsLink(protocols_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if protocols_list is not None: - protocolsPath= "/YEAST_LAB/" + protocols_list - permId =transaction.getSample(protocolsPath).getSample().getPermId() - if not permId: - permId = protocols_list - name = transaction.getSample(protocolsPath).getPropertyValue("NAME") - if name is None: - name = "n.a." - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, protocols_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateProtocolsFromBatchInput(protocols_list): - elements = [] - input = protocols_list - if input != "": - for i in protocols_list: - sampleLink = _createProtocolsLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - updateProtocolsFromBatchInput(protocols_list) - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, quantity_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, quantity_list): - elements = [] - input = chemicals_list - input2 = quantity_list - if input != "": - for i, j in zip(chemicals_list,quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT MEDIA#################################################################### - - - def _createMediasLink(medias_list, medias_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if medias_list is not None: - mediasPath= "/YEAST_LAB/" + medias_list - permId =transaction.getSample(mediasPath).getSample().getPermId() - if not permId: - permId = medias_list - name = transaction.getSample(mediasPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, medias_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, medias_quantity_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateMediasFromBatchInput(medias_list, medias_quantity_list): - elements = [] - input = medias_list - input2 = medias_quantity_list - if input != "": - for i, j in zip(medias_list,medias_quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createMediasLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_quantity_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_QUANTITY, buffers_quantity_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_quantity_list): - elements = [] - input = buffers_list - input2 = buffers_quantity_list - if input != "": - for i, j in zip(buffers_list,buffers_quantity_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT ENZYMES#################################################################### - - - def _createEnzymesLink(enzymes_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if enzymes_list is not None: - enzymesPath= "/YEAST_LAB/" + enzymes_list - permId =transaction.getSample(enzymesPath).getSample().getPermId() - if not permId: - permId = enzymes_list - name = transaction.getSample(enzymesPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, enzymes_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateEnzymesFromBatchInput(enzymes_list): - elements = [] - input = enzymes_list - if input != "": - for i in enzymes_list: - sampleLink = _createEnzymesLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - print "comments", comment_text_list - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'READOUT') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set enzymes, chemicals, buffers as parents for the sample""" - - - protocolId_list =[] - for protocol in protocols_list: - protocolIdentifier = "/YEAST_LAB/" + protocol.strip() - protocolId_list.append(protocolIdentifier) - - - enzymeId_list =[] - for enzyme in enzymes_list: - enzymeIdentifier = "/YEAST_LAB/" + enzyme.strip() - enzymeId_list.append(enzymeIdentifier) - - chemicalId_list =[] - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - mediaId_list =[] - for media in medias_list: - mediaIdentifier = "/YEAST_LAB/" + media.strip() - mediaId_list.append(mediaIdentifier) - - - parents_list = enzymeId_list + chemicalId_list + bufferId_list + mediaId_list - newSample.setParentSampleIdentifiers(parents_list) - - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,quantity_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_quantity_list)) - if child.tag == "Enzymes": - newSample.setPropertyValue("Enzymes",updateEnzymesFromBatchInput(enzymes_list)) - if child.tag == "Media": - newSample.setPropertyValue("Media",updateMediasFromBatchInput(medias_list,medias_quantity_list)) - if child.tag == "General_Protocol": - newSample.setPropertyValue("GENERAL_PROTOCOL", updateProtocolsFromBatchInput(protocols_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "Media" and child.tag != "General_Protocol" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Enzymes": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/plugin.properties b/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/plugin.properties deleted file mode 100644 index 1798c5b2bb7043ac18714328423053e494d6b702..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -# Image drop box which registers a dataset from the webUI -# -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. - -dropbox-name = ylab-westernblotting-dropbox - -incoming-dir = /local0/openbis/yeastlab-server/dss-data/incoming-xml -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = xml_import-westernblotting-dropbox-v2.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/xml_import-westernblotting-dropbox-v2.py b/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/xml_import-westernblotting-dropbox-v2.py deleted file mode 100644 index f4d409429bfe4f5c5663e1c975ce223707c124d9..0000000000000000000000000000000000000000 --- a/plasmid/source/drop-boxes/ylab-westernblotting-dropbox/xml_import-westernblotting-dropbox-v2.py +++ /dev/null @@ -1,424 +0,0 @@ -#! /usr/bin/env python -""" - Import sample properties from a text file. -""" -print "########################################################" - -import os -import glob -import re -import time -import shutil, sys - -import xml.etree.ElementTree as ET -from xml.etree import ElementTree - -from time import * -from datetime import datetime -import calendar - -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import ElementFactory -from ch.systemsx.cisd.openbis.generic.shared.managed_property.structured import XmlStructuredPropertyConverter - -ATR_NAME='name' -ATR_CODE = "code" -ATR_CONC = "concentration" -DATE_ATTRIBUTE = 'date' -PERSON_ATTRIBUTE = 'person' -COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry' -LINK_LABEL = "link" -CODE_LABEL = "code" -CONC_LABEL = "concentration" -DATE_LABEL = 'Date' -PERSON_LABEL = 'Person' -COMMENT_TEXT_LABEL = 'Comment Text' -NAME_LABEL='name' - -chemicals_list=[] -concentration_list=[] -buffers_list=[] -buffers_concentration_list =[] -date_list=[] -person_list=[] -comment_text_list=[] -antibodies_list=[] - - -def create_openbis_timestamp(): - tz=localtime()[3]-gmtime()[3] - d=datetime.now().timetuple() - timestamp = (calendar.timegm(d)*1000) - return timestamp - - -def process(transaction): - incomingPath = transaction.getIncoming().getAbsolutePath() - -###PARSE XML FILE############################################################ - - - textfile = open(incomingPath, "r") - tree = ET.parse(textfile) - root = tree.getroot() - - - - for path in [ './Identifier']: - node = tree.find(path) - if node.text != "": - sample_name = node.text - else: - node.text = "" - - - for path in [ './Experiment']: - node = tree.find(path) - if node.text != "": - experiment_name = node.text - else: - node.text = "" - - - - chemicals_found = False - for child in root.getchildren(): - if child.tag == 'Chemicals': - chemicals_found = True - def Chemicals(): - for path in [ './Chemicals']: - node = tree.find(path) - if node.text is not None: - chemicals = node.text - tokens = chemicals.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - chemical_name = token[0] - chemical_concentration=token[1] - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - chemical_name=token - chemical_concentration = "n.a." - chemicals_list.append(chemical_name) - concentration_list.append(chemical_concentration) - else: - node.text = "n.a." - return chemicals_list, concentration_list - - Chemicals() - if not chemicals_found: - chemicals= None - chemical_name = None - chemical_concentration = None - chemicals_list = None - concentration_list = None - - - buffers_found = False - for child in root.getchildren(): - if child.tag == 'Solutions_Buffers': - buffers_found = True - def Buffers(): - for path in [ './Solutions_Buffers']: - node = tree.find(path) - if node.text is not None: - buffers = node.text - tokens = buffers.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - buffer_name = token[0] - buffer_concentration=token[1] - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - buffer_name=token - buffer_concentration = "n.a." - buffers_list.append(buffer_name) - buffers_concentration_list.append(buffer_concentration) - else: - node.text = "n.a." - return buffers_list, buffers_concentration_list - - Buffers() - if not chemicals_found: - buffers= None - buffer_name = None - buffer_concentration = None - buffers_list = None - buffers_concentration_list = None - - - - antibodies_found = False - for child in root.getchildren(): - if child.tag == 'Antibodies': - antibodies_found = True - def Antibodies(): - for path in [ './Antibodies']: - node = tree.find(path) - if node.text is not None: - antibodies = node.text - tokens = antibodies.split(',') - for token in tokens: - if re.search(":", token): - token = token.split(':') - antibody_name = token[0] - antibody_concentration=token[1] - antibodies_list.append(antibody_name) - else: - antibody_name=token - antibody_concentration = "n.a." - antibodies_list.append(antibody_name) - else: - node.text = "n.a." - - return antibodies_list - Antibodies() - if not antibodies_found: - antibodies= None - antibody_name = None - antibody_concentration = None - antibodies_list = None - - - - - - xmlcomments_found = False - for child in root.getchildren(): - if child.tag == 'XMLCOMMENTS': - xmlcomments_found = True - for path in [ './XMLCOMMENTS']: - node = tree.find(path) - if node.text is not None: - comment_text_list= node.text - else: - comment_text_list = None - if not xmlcomments_found: - comment_text_list = None - - - - elementFactory = ElementFactory() - - propertyConverter = XmlStructuredPropertyConverter(elementFactory); - - - -###IMPORT CHEMICALS#################################################################### - - - def _createChemicalsSampleLink(chemicals_list, concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if chemicals_list is not None: - chemicalPath= "/YEAST_LAB/" + chemicals_list - permId =transaction.getSample(chemicalPath).getSample().getPermId() - name = transaction.getSample(chemicalPath).getPropertyValue("NAME") - if not permId: - permId = chemicals_list - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, chemicals_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, concentration_list) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateChemicalsFromBatchInput(chemicals_list, concentration_list): - elements = [] - input = chemicals_list - input2 = concentration_list - if input != "": - for i, j in zip(chemicals_list,concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createChemicalsSampleLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT SOLUTION BUFFERS#################################################################### - - - def _createBuffersLink(buffers_list, buffers_concentration_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if buffers_list is not None: - buffersPath= "/YEAST_LAB/" + buffers_list - permId =transaction.getSample(buffersPath).getSample().getPermId() - if not permId: - permId = buffers_list - name = transaction.getSample(buffersPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, buffers_list) - sampleLink.addAttribute(ATR_NAME, name) - sampleLink.addAttribute(ATR_CONC, buffers_concentration_list) - - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateBuffersFromBatchInput(buffers_list, buffers_concentration_list): - elements = [] - input = buffers_list - input2 = buffers_concentration_list - if input != "": - for i, j in zip(buffers_list,buffers_concentration_list): #zip is used to iterate over two lists in parallel - sampleLink = _createBuffersLink(i.strip(), j.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - -###IMPORT MEDIA#################################################################### - - - def _createAntibodiesLink(antibodies_list): - """ - Creates sample link XML element for sample with specified 'code'. The element will contain - given code as 'code' attribute apart from standard 'permId' attribute. - - If the sample doesn't exist in DB a fake link will be created with the 'code' as permId. - - @return: sample link XML element as string, e.g.: - - '<Sample code="FRP1" permId="20110309154532868-4219"/>' - - '<Sample code="FAKE_SAMPLE_CODE" permId="FAKE_SAMPLE_CODE"/> - """ - if antibodies_list is not None: - antibodiesPath= "/YEAST_LAB/" + antibodies_list - permId =transaction.getSample(antibodiesPath).getSample().getPermId() - if not permId: - permId = antibodies_list - name = transaction.getSample(antibodiesPath).getPropertyValue("NAME") - sampleLink = elementFactory.createSampleLink(permId) - - sampleLink.addAttribute(ATR_CODE, antibodies_list) - sampleLink.addAttribute(ATR_NAME, name) - - return sampleLink - - - """ - Example input: - - FRC1: 2nM, FRC2, FRC3: 4nM, FRC4 - """ - - - def updateAntibodiesFromBatchInput(antibodies_list): - elements = [] - input = antibodies_list - if input != "": - for i in antibodies_list: - sampleLink = _createAntibodiesLink(i.strip()) - elements.append(sampleLink) - return propertyConverter.convertToString(elements) - - -###IMPORT COMMENTS#################################################################### - - - - def _createCommentsSampleLink(comment_text_list): - #if comment_text_list is not None: - commentEntry = elementFactory.createElement(COMMENT_ENTRY_ELEMENT_LABEL) - - user = transaction.getUserId() - commentEntry.addAttribute(PERSON_ATTRIBUTE, user) - commentEntry.addAttribute(DATE_ATTRIBUTE,str(create_openbis_timestamp())) - commentEntry.setData(comment_text_list) - print "comments", comment_text_list - return commentEntry - - def updateCommentsFromBatchInput(comment_text_list): - elements = [] - input = comment_text_list - #if input is not None: - commentEntry = _createCommentsSampleLink(comment_text_list) - elements.append(commentEntry) - return propertyConverter.convertToString(elements) - - _createCommentsSampleLink(comment_text_list) - - - - -###CREATE New sample with related properties################################################# - - newSampleIdentifier="/YEAST_LAB/" + sample_name - newSample=transaction.createNewSample(newSampleIdentifier,'WESTERN_BLOTTING') - - - exp = transaction.getExperiment(experiment_name) - newSample.setExperiment(exp) - - """ Set antibodies, chemicals, buffers as parents for the sample""" - - antibodyId_list =[] - if antibodies_list != None: - for antibody in antibodies_list: - antibodyIdentifier = "/YEAST_LAB/" + antibody.strip() - antibodyId_list.append(antibodyIdentifier) - - chemicalId_list =[] - if chemicals_list != None: - for chemical in chemicals_list: - chemicalIdentifier = "/YEAST_LAB/" + chemical.strip() - chemicalId_list.append(chemicalIdentifier) - - bufferId_list =[] - if buffers_list != None: - for buffer in buffers_list: - bufferIdentifier = "/YEAST_LAB/" + buffer.strip() - bufferId_list.append(bufferIdentifier) - - parents_list = antibodyId_list + chemicalId_list + bufferId_list - newSample.setParentSampleIdentifiers(parents_list) - - - for child in root: - if child.tag == "Chemicals": - newSample.setPropertyValue("CHEMICALS",updateChemicalsFromBatchInput(chemicals_list,concentration_list)) - if child.tag == "Solutions_Buffers": - newSample.setPropertyValue("SOLUTIONS_BUFFERS",updateBuffersFromBatchInput(buffers_list,buffers_concentration_list)) - if child.tag == "Antibodies": - newSample.setPropertyValue("ANTIBODIES",updateAntibodiesFromBatchInput(antibodies_list)) - if child.tag == "XMLCOMMENTS": - newSample.setPropertyValue("XMLCOMMENTS", updateCommentsFromBatchInput(comment_text_list)) - if child.tag != "Identifier" and child.tag !="Experiment" and child.tag != "Chemicals" and child.tag != "XMLCOMMENTS" and child.tag != "Solutions_Buffers" and child.tag != "Antibodies": - if child.text != None: - newSample.setPropertyValue(child.tag, child.text) - else: - child.text= "" - newSample.setPropertyValue(child.tag, child.text) diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/.gitignore b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/.gitignore deleted file mode 100644 index a8513c64ba280ab88b1917f21899ce560b112860..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/PlasmidStorageProcessor.java -/CopyOfPlasmidDataSetHandler.java diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracle.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracle.java deleted file mode 100644 index 8e805bfe4ed8d7bb295a270d0b203a7bcec8b1ff..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracle.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Map.Entry; - -import org.apache.commons.io.FilenameUtils; - -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.etlserver.FileTypeExtractor; - -/** - * This oracle knows the extensions of the different types of data files provided by CSB. - * - * @author Piotr Buczek - */ -class DataSetTypeOracle -{ - public static final String DATASET_TYPES_NAME = "dataset-types"; - - /** - * The different kinds of data set types known to the oracle. - * - * @author Piotr Buczek - */ - static enum DataSetTypeInfo - { - // only SEQ_FILE files are derived, other files are measured - SEQ_FILE(false), RAW_DATA(true), VERIFICATION(true), UNKNOWN(true); - - private final boolean measured; - - DataSetTypeInfo(boolean measured) - { - this.measured = measured; - } - - public String getDataSetTypeCode() - { - return name(); - } - - public boolean isMeasured() - { - return measured; - } - } - - private static DataSetTypeInfo getType(final String typeName) - { - try - { - return DataSetTypeInfo.valueOf(typeName); - } catch (IllegalArgumentException e) - { - throw ConfigurationFailureException.fromTemplate( - "Wrong dataset type '%s'. Expected one of: '%s'.", typeName, Arrays - .toString(DataSetTypeInfo.values())); - } - } - - private static Map<String, DataSetTypeInfo> typeInfoByExtension = - new HashMap<String, DataSetTypeInfo>(); - - static void initializeMapping(Properties properties) - { - Map<String, String> map = - FileTypeExtractor.createTypeByFileExtensionMap(properties, DATASET_TYPES_NAME); - for (Entry<String, String> entry : map.entrySet()) - { - typeInfoByExtension.put(entry.getKey(), getType(entry.getValue())); - } - } - - /** - * Extracts {@link DataSetTypeInfo} from the name of the dataset file. - * - * @throws UserFailureException if <var>incomingDataSetPath</var> is a path to a directory - */ - static DataSetTypeInfo extractDataSetTypeInfo(File incomingDataSetPath) - throws UserFailureException - { - if (incomingDataSetPath.isDirectory()) - { - return DataSetTypeInfo.UNKNOWN; - } - - final String fileName = incomingDataSetPath.getName().toLowerCase(); - final String fileExtension = FilenameUtils.getExtension(fileName); - - DataSetTypeInfo result = tryGetMappedType(fileExtension); - return result == null ? DataSetTypeInfo.VERIFICATION : result; - } - - private static DataSetTypeInfo tryGetMappedType(String fileExtension) - { - return typeInfoByExtension.get(normalizeExtension(fileExtension)); - } - - private static String normalizeExtension(String extension) - { - return extension.toUpperCase(); - } - -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/ParentDirectoryDataSetInfoExtractor.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/ParentDirectoryDataSetInfoExtractor.java deleted file mode 100644 index a66aeb115518183a67a0bb7bc2f841b1c6adb9f5..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/ParentDirectoryDataSetInfoExtractor.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.etlserver.AbstractDelegatingDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; - -/** - * CSB uses DSS to register data sets attached to an existing sample plasmid. This extractor will receive a file that is inside a directory from which - * delegate will extract information about the sample. - * - * @author Piotr Buczek - */ -public class ParentDirectoryDataSetInfoExtractor extends AbstractDelegatingDataSetInfoExtractor -{ - - public ParentDirectoryDataSetInfoExtractor(final Properties properties) - { - super(properties); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetFile, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - return super.getDataSetInformation(incomingDataSetFile.getParentFile(), openbisService); - } -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidDataSetHandler.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidDataSetHandler.java deleted file mode 100644 index c874c708b10edc0218fcaebd1fcd680a9c6fb813..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidDataSetHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.io.FileFilter; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.io.filefilter.HiddenFileFilter; -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.etlserver.IDataSetHandler; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; - -/** - * Data set handler for plasmid data sets. - * <p> - * All visible files (with names not starting with '.') in the handled directory are delegated to the handler provided in the constructor. As the - * result a new data set will be created for each file in the directory. - * - * @author Piotr Buczek - */ -public class PlasmidDataSetHandler implements IDataSetHandler -{ - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, PlasmidDataSetHandler.class); - - private final IDataSetHandler delegator; - - public PlasmidDataSetHandler(Properties parentProperties, IDataSetHandler delegator, - IEncapsulatedOpenBISService openbisService) - { - this.delegator = delegator; - } - - @Override - public List<DataSetInformation> handleDataSet(File dataSet) - { - if (dataSet.isDirectory() == false) - { - throw UserFailureException.fromTemplate( - "Failed to handle file '%s'. Expected a directory.", dataSet); - } - - // handle all visible files by delegator - List<DataSetInformation> result = new ArrayList<DataSetInformation>(); - final File[] visibleFiles = dataSet.listFiles((FileFilter) HiddenFileFilter.VISIBLE); - for (File file : visibleFiles) - { - result.addAll(delegator.handleDataSet(file)); - } - - // delete all hidden files and the directory - final File[] hiddenFiles = dataSet.listFiles((FileFilter) HiddenFileFilter.HIDDEN); - for (File file : hiddenFiles) - { - String deletionStatus = - FileUtilities.deleteRecursively(file) ? "Deleted" : "Failed to delete"; - operationLog.info(String.format("%s hidden file: %s", deletionStatus, file)); - } - if (dataSet.delete() == false) - { - throw new EnvironmentFailureException(String.format("Failed to delete '%s' directory.", - dataSet)); - } - - return result; - } -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidStorageProcessor.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidStorageProcessor.java deleted file mode 100644 index 606ebde47b97b5155ab085423140c37f7cefdf84..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidStorageProcessor.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.util.Properties; - -import org.apache.commons.io.FilenameUtils; -import org.apache.log4j.Logger; - -import ch.ethz.bsse.cisd.plasmid.plasmapper.PlasMapperUploader; -import ch.ethz.bsse.cisd.plasmid.plasmapper.PlasMapperUploader.PlasMapperService; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.filesystem.FileOperations; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.etlserver.AbstractDelegatingStorageProcessor; -import ch.systemsx.cisd.etlserver.AbstractDelegatingStorageProcessorTransaction; -import ch.systemsx.cisd.etlserver.ITypeExtractor; - -/** - * Stores files containing plasmid data in the DSS store. Additionally for files holding a DNA sequence it uses PlasMapper (see - * http://wishart.biology.ualberta.ca/PlasMapper/) to generate: - * <ul> - * <li>a GB file with the same sequence but in a standard Genbank format - * <li>a PNG file with a graphical representation of the plasmid sequence (Graphic Map) - * </ul> - * The generated files will be stored in a separate directory ('generated') of the created Dataset. They will have the same base name as the original - * file holding the DNA sequence which will be kept in 'original' directory. - * - * @author Piotr Buczek - */ -public class PlasmidStorageProcessor extends AbstractDelegatingStorageProcessor -{ - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - PlasmidStorageProcessor.class); - - private static final Logger notifyLog = LogFactory.getLogger(LogCategory.NOTIFY, - PlasmidStorageProcessor.class); - - private final static String HTML_FILE_TEMPLATE = - "<html><head>\n" - + "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\"><title>PlasMapper - Graphic Map</title></head>\n" - + "<body>\n" - + "<embed src=\"%%FILE_NAME%%\" type=\"image/svg+xml\" pluginspage=\"http://www.adobe.com/svg/viewer/install/\" id=\"Panel\" height=\"1010\" width=\"1010\">\n" - + "<br>\n" + "<a href=\"%%FILE_NAME%%\" target=\"_blank\">Download Link</a>" - + "</body></html>"; - - private final static String PLASMAPPER_BASE_URL_KEY = "plasmapper-base-url"; - - private final static String PLASMAPPER_ROOT_DIR_KEY = "plasmapper-root-dir"; - - private static final String ORIGINAL_DIR = "original"; - - private static final String GENERATED_DIR = "generated"; - - private static final String GB_FILE_EXTENSION = ".gb"; - - private static final String SVG_FILE_EXTENSION = ".svg"; - - private final PlasMapperUploader uploader; - - private final String serverRootDir; - - public PlasmidStorageProcessor(Properties properties) - { - super(properties); - final String baseUrl = - PropertyUtils.getMandatoryProperty(properties, PLASMAPPER_BASE_URL_KEY); - this.uploader = new PlasMapperUploader(baseUrl); - this.serverRootDir = - PropertyUtils.getMandatoryProperty(properties, PLASMAPPER_ROOT_DIR_KEY); - - final File serverRootFile = new File(serverRootDir); - if ((serverRootFile.isDirectory() && serverRootFile.canRead()) == false) - { - final String msg = - String.format("'%s' (value of '%s' property) is supposed to be a path " - + "to an existing readable directory but isn't.", serverRootDir, - PLASMAPPER_ROOT_DIR_KEY); - throw new EnvironmentFailureException(msg); - } - } - - @Override - public IStorageProcessorTransaction createTransaction( - StorageProcessorTransactionParameters parameters) - { - return new PlasmidStorageProcessorTransaction(parameters, - super.createTransaction(parameters), this); - } - - // WORKAROUND cannot move the file because it is on a different filesystem - private void uploadAndCopyGeneratedFile(final File seqFile, final PlasMapperService service, - final File destinationFile) - { - String outputFilePath = uploader.upload(seqFile, service); - if (StringUtils.isBlank(outputFilePath)) - { - notifyLog.error("Cannot upload file '" + seqFile.getName() - + "', see jetty.out for details."); - throw new IllegalStateException("Cannot upload file '" + seqFile.getName() - + "', see jetty.out for details."); - } - File outputFile = new File((serverRootDir + outputFilePath).trim()); - if (outputFile.isFile()) - { - operationLog.info("Renaming and copying file '" + outputFile.getName() + "' from '" - + outputFile + "' to " + destinationFile); - FileOperations.getInstance().copyFile(outputFile, destinationFile); - - if (destinationFile.getName().endsWith("svg")) - { - String htmlFileName = destinationFile.getName().replaceAll(".svg", ".html"); - File htmlFile = new File(destinationFile.getParentFile(), htmlFileName); - operationLog.info("Generating html file '" + htmlFile + "'"); - FileUtilities.writeToFile(htmlFile, - HTML_FILE_TEMPLATE.replaceAll("%%FILE_NAME%%", destinationFile.getName())); - } - } else - { - throw new EnvironmentFailureException("'" + outputFile - + "' doesn't exist or is not a file."); - } - } - - static class PlasmidStorageProcessorTransaction extends - AbstractDelegatingStorageProcessorTransaction - { - - private static final long serialVersionUID = 1L; - - private final transient PlasmidStorageProcessor processor; - - public PlasmidStorageProcessorTransaction(StorageProcessorTransactionParameters parameters, - IStorageProcessorTransaction superTransaction, PlasmidStorageProcessor processor) - { - super(parameters, superTransaction); - this.processor = processor; - } - - @Override - protected File executeStoreData(ITypeExtractor typeExtractor, IMailClient mailClient) - { - nestedTransaction.storeData(typeExtractor, mailClient, incomingDataSetDirectory); - File answer = nestedTransaction.getStoredDataDirectory(); - - boolean isSeqType = - typeExtractor.getDataSetType(incomingDataSetDirectory).getCode() - .equals(DataSetTypeOracle.DataSetTypeInfo.SEQ_FILE.name()); - boolean isFaExtension = - "fa".equals(FilenameUtils.getExtension(incomingDataSetDirectory.getName())); - - if (isSeqType && !isFaExtension) - { - File originalDir = new File(answer, ORIGINAL_DIR); - File[] files = originalDir.listFiles(); - assert files.length == 1; - File seqFile = files[0]; - - String baseFileName = FilenameUtils.getBaseName(seqFile.getName()); - String svgFileName = baseFileName + SVG_FILE_EXTENSION; - String gbFileName = baseFileName + GB_FILE_EXTENSION; - - File generatedDir = new File(answer, GENERATED_DIR); - if (generatedDir.mkdir()) - { - final File svgFileDest = new File(generatedDir, svgFileName); - final File gbFileDest = new File(generatedDir, gbFileName); - - operationLog.info("Uploading '" + seqFile.getName() + "' to PlasMapper."); - processor.uploadAndCopyGeneratedFile(seqFile, PlasMapperService.GRAPHIC_MAP, - svgFileDest); - processor.uploadAndCopyGeneratedFile(seqFile, - PlasMapperService.GENEBANK_OUTPUT, gbFileDest); - } else - { - throw new EnvironmentFailureException("Couldn't create directory '" - + generatedDir + "'."); - } - } - return answer; - } - - @Override - protected UnstoreDataAction executeRollback(Throwable ex) - { - return nestedTransaction.rollback(ex); - } - - @Override - protected void executeCommit() - { - nestedTransaction.commit(); - } - } - -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidTypeExtractor.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidTypeExtractor.java deleted file mode 100644 index 401b448f8b6d3fa0e131373e5223e5f8eab9199d..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/dss/PlasmidTypeExtractor.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.etlserver.FileTypeExtractor; -import ch.systemsx.cisd.etlserver.ITypeExtractor; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; - -/** - * The extractor that recognizes following data set types: - * <ul> - * <li>SEQ_FILE -- for a single file with one of extensions: <b>gb</b>, <b>fasta</b>, <b>xdna</b> - * <li>RAW_DATA -- for a single file with <b>ab1</b> extension - * <li>VERIFICATION -- for all other single files - * <li>UNKNOWN -- for directories (they can contain files with arbitrary data) - * </ul> - * - * @author Piotr Buczek - */ -public class PlasmidTypeExtractor extends FileTypeExtractor implements ITypeExtractor -{ - - public PlasmidTypeExtractor(final Properties properties) - { - super(properties); - DataSetTypeOracle.initializeMapping(properties); - } - - @Override - public DataSetType getDataSetType(File incomingDataSetPath) - { - final String code = - DataSetTypeOracle.extractDataSetTypeInfo(incomingDataSetPath).getDataSetTypeCode(); - return new DataSetType(code); - } - - @Override - public LocatorType getLocatorType(File incomingDataSetPath) - { - return new LocatorType(LocatorType.DEFAULT_LOCATOR_TYPE_CODE); - } - - @Override - public String getProcessorType(File incomingDataSetPath) - { - return null; - } - - @Override - public boolean isMeasuredData(File incomingDataSetPath) - { - return DataSetTypeOracle.extractDataSetTypeInfo(incomingDataSetPath).isMeasured(); - } - -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/plasmapper/PlasMapperUploader.java b/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/plasmapper/PlasMapperUploader.java deleted file mode 100644 index 8e27b0683b9fb41e8fa61e0e93c6fda1e7a391fa..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/plasmid/plasmapper/PlasMapperUploader.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.plasmapper; - -import java.io.File; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentProvider; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.util.StringContentProvider; -import org.eclipse.jetty.http.HttpStatus; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.http.JettyHttpClientFactory; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; - -/** - * Uploads provided sequence file to PlasMapper. - * - * @author Piotr Buczek - */ -public class PlasMapperUploader -{ - - private static final String CRLF = "\r\n"; - - private static final String BOUNDARY = "MMMMM___MP_BOUNDARY___MMMMM"; - - private final static String DEFAULT_PLASMAPPER_URL = "http://wishart.biology.ualberta.ca/PlasMapper"; - - private static Properties createDefaultProperties() - { - Properties result = new Properties(); - result.setProperty("vendor", "Amersham%20Pharmacia"); - result.setProperty("showOption", "1,2,3,4,5,6,7,8,9"); - result.setProperty("restriction", "1"); - result.setProperty("orfLen", "200"); - result.setProperty("strand", "1,2"); - result.setProperty("featureName1", ""); - result.setProperty("featureName2", ""); - result.setProperty("featureName3", ""); - result.setProperty("featureName4", ""); - result.setProperty("featureName5", ""); - result.setProperty("featureName6", ""); - result.setProperty("dir1", "1"); - result.setProperty("dir2", "1"); - result.setProperty("dir3", "1"); - result.setProperty("dir4", "1"); - result.setProperty("dir5", "1"); - result.setProperty("dir6", "1"); - result.setProperty("category1", "origin_of_replication"); - result.setProperty("category2", "origin_of_replication"); - result.setProperty("category3", "origin_of_replication"); - result.setProperty("category4", "origin_of_replication"); - result.setProperty("category5", "origin_of_replication"); - result.setProperty("category6", "origin_of_replication"); - result.setProperty("stop1", ""); - result.setProperty("stop2", ""); - result.setProperty("stop3", ""); - result.setProperty("stop4", ""); - result.setProperty("stop5", ""); - result.setProperty("stop6", ""); - result.setProperty("scheme", "0"); - result.setProperty("shading", "0"); - result.setProperty("labColor", "0"); - result.setProperty("labelBox", "1"); - result.setProperty("labels", "0"); - result.setProperty("innerLabels", "0"); - result.setProperty("legend", "0"); - result.setProperty("arrow", "0"); - result.setProperty("tickMark", "0"); - result.setProperty("mapTitle", ""); - result.setProperty("comment", "Created using PlasMapper"); - result.setProperty("imageFormat", "SVG"); - result.setProperty("imageSize", "1000 x 1000"); - result.setProperty("backbone", "medium"); - result.setProperty("arc", "medium"); - // special: result of request == relative path to the SVG/GB file - result.setProperty("biomoby", "true"); - return result; - } - - public enum PlasMapperService - { - - GRAPHIC_MAP("/servlet/DrawVectorMap"), GENEBANK_OUTPUT("/servlet/GenbankOutput"); - - private final String servletPath; - - PlasMapperService(String servletPath) - { - this.servletPath = servletPath; - } - - String getServletPath() - { - return servletPath; - } - - } - - private static final String LIST_SEPARATOR = ","; - - private final static String FILE_PART_NAME = "fastaFile"; - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - PlasMapperUploader.class); - - private static final Logger notificationLog = LogFactory.getLogger(LogCategory.NOTIFY, - PlasMapperUploader.class); - - public static void main(String[] args) - { - final Properties p = createDefaultProperties(); - final PlasMapperUploader uploader = new PlasMapperUploader(DEFAULT_PLASMAPPER_URL, p); - final File seqFile = new File("source/core-plugins/eln-lims/1/dss/reporting-plugins/newbrowserapi/lib/plasmapper-source/FRP1955.fasta"); - for (PlasMapperService service : PlasMapperService.values()) - { - String response = uploader.upload(seqFile, service); - System.out.println(String.format("Response of %s service: '%s'", service, response)); - } - } - - private final String baseUrl; - - private final Properties properties; - - public PlasMapperUploader(String baseUrl, Properties properties) - { - this.baseUrl = baseUrl; - this.properties = properties; - } - - public PlasMapperUploader(String baseUrl) - { - this(baseUrl, createDefaultProperties()); - } - - /** - * Makes an HTTP multipart POST request with given file. - * - * @param seqFile file to be uploaded - * @param service service to be used for upload - * @return the server's response to the request depending on the service (path to output image or sequence in genebank format) - */ - // Synchronization is needed because PlasMapper servlet is not thread safe (see LMS-2086) - public synchronized String upload(File seqFile, PlasMapperService service) - { - String url = baseUrl + service.getServletPath(); - try - { - HttpClient httpClient = JettyHttpClientFactory.getHttpClient(); - Request request = httpClient.newRequest(url).method("POST"); - for (Enumeration<?> enumeration = properties.propertyNames(); enumeration.hasMoreElements();) - { - final String key = (String) enumeration.nextElement(); - String[] values = properties.getProperty(key).split(LIST_SEPARATOR); - for (String value : values) - { - request.param(key, StringUtils.trim(value)); - } - } - String fileContent = FileUtilities.loadToString(seqFile); - ContentProvider content = new StringContentProvider("--" + BOUNDARY + CRLF - + "Content-Disposition: form-data; name=\"" + FILE_PART_NAME + "\"; filename=\"" - + seqFile.getName() + "\"" + CRLF - + "Content-Type: application/octet-stream" + CRLF + CRLF - + fileContent + CRLF + "--" + BOUNDARY + "--" + CRLF); - request.content(content, "multipart/form-data; boundary=" + BOUNDARY); - ContentResponse contentResponse = request.send(); - String responseAsString = contentResponse.getContentAsString(); - int status = contentResponse.getStatus(); - if (status != HttpStatus.Code.OK.getCode()) - { - notificationLog.error("Multipart POST failed: " + status + " " + responseAsString); - throw new IOExceptionUnchecked(new IOException("Multipart POST failed: " - + status)); - } - operationLog.info(String.format("Response of %s service: '%s'", service, responseAsString)); - return responseAsString; - } catch (final Exception ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - -} diff --git a/plasmid/source/java/ch/ethz/bsse/cisd/yeastlab/ipad/v2/server/IpadYeastlabUtilities.java b/plasmid/source/java/ch/ethz/bsse/cisd/yeastlab/ipad/v2/server/IpadYeastlabUtilities.java deleted file mode 100644 index af13e83aea2792adb188877840fcac6093b89643..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/ethz/bsse/cisd/yeastlab/ipad/v2/server/IpadYeastlabUtilities.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2013 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.yeastlab.ipad.v2.server; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample; -import ch.systemsx.cisd.openbis.ipad.v2.server.IpadServiceUtilities; - -/** - * @author cramakri - */ -public class IpadYeastlabUtilities -{ - - /** - * Return a collection of properties, ordered by display ordering, skipping propsToIgnore. - */ - public static List<String> orderedPropertiesForSampleIgnoring(ISample sample, - List<String> propsToIgnore) - { - return null; - } - - /** - * Convert a sample to a dictionary, ignoring the specified properties. - * <p> - * <ul> - * <li>Uses the NAME property to construct the summary.</li> - * <li>Returns empty children.</li> - * <li>Callers may need to modify the summary and children as well</li> - * </ul> - */ - public static Map<String, Object> samplToDictWithPropsIgnoring(ISample sample, - boolean wantProps, List<String> propsToIgnore) - { - HashMap<String, Object> sampleDict = new HashMap<String, Object>(); - sampleDict.put("SUMMARY_HEADER", sample.getCode()); - String name = sample.getPropertyValue("NAME"); - String summary = (null != name) ? "Name: " + name : "??"; - sampleDict.put("SUMMARY", summary); - sampleDict.put("IDENTIFIER", sample.getSampleIdentifier()); - sampleDict.put("PERM_ID", sample.getPermId()); - - HashMap<String, String> refconSample = new HashMap<String, String>(); - refconSample.put("code", sample.getCode()); - refconSample.put("entityKind", "SAMPLE"); - refconSample.put("entityType", sample.getSampleType()); - sampleDict.put("REFCON", IpadServiceUtilities.jsonEncodedValue(refconSample)); - sampleDict.put("CATEGORY", sample.getSampleType()); - sampleDict.put("CHILDREN", IpadServiceUtilities.jsonEncodedValue(Collections.emptyList())); - - if (wantProps) - { - List<String> sampleProperties = - orderedPropertiesForSampleIgnoring(sample, propsToIgnore); - sampleDict.put("PROPERTIES", IpadServiceUtilities.jsonEncodedValue(sampleProperties)); - } - - sampleDict.put("ROOT_LEVEL", false); - return sampleDict; - } -} diff --git a/plasmid/source/java/ch/systemsx/cisd/plasmid/BuildAndEnvironmentInfo.java b/plasmid/source/java/ch/systemsx/cisd/plasmid/BuildAndEnvironmentInfo.java deleted file mode 100644 index 182552491597084204def8efea52a2b6ccd005eb..0000000000000000000000000000000000000000 --- a/plasmid/source/java/ch/systemsx/cisd/plasmid/BuildAndEnvironmentInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.plasmid; - -import ch.systemsx.cisd.base.utilities.AbstractBuildAndEnvironmentInfo; - -/** - * The build and environment information for PLASMID. - * - * @author Piotr Buczek - */ -public class BuildAndEnvironmentInfo extends AbstractBuildAndEnvironmentInfo -{ - private final static String BASE = "plasmid"; - - public final static BuildAndEnvironmentInfo INSTANCE = new BuildAndEnvironmentInfo(); - - private BuildAndEnvironmentInfo() - { - super(BASE); - } - - /** - * Shows build and environment information on the console. - */ - public static void main(String[] args) - { - System.out.println(INSTANCE); - } - -} diff --git a/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/DependencyCheckingTest.java b/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/DependencyCheckingTest.java deleted file mode 100644 index c99c167fd6d9b3843df31af02873bbb54250c018..0000000000000000000000000000000000000000 --- a/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/DependencyCheckingTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid; - -/** - * @author Franz-Josef Elmer - */ -public class DependencyCheckingTest extends ch.systemsx.cisd.common.test.DependencyCheckingTest -{ - -} diff --git a/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracleTest.java b/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracleTest.java deleted file mode 100644 index 6eb6b8a3bad3d54f86197edb6383997820679859..0000000000000000000000000000000000000000 --- a/plasmid/sourceTest/java/ch/ethz/bsse/cisd/plasmid/dss/DataSetTypeOracleTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.plasmid.dss; - -import java.io.File; -import java.util.Properties; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import ch.ethz.bsse.cisd.plasmid.dss.DataSetTypeOracle.DataSetTypeInfo; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; - -/** - * @author Piotr Buczek - */ -public class DataSetTypeOracleTest extends AbstractFileSystemTestCase -{ - private static final String MAPPING = "SEQ_FILE: gb fasta xdna, RAW_DATA: ab1"; - - @DataProvider(name = "files") - protected Object[][] files() - { - return new Object[][] - { - { "PRS316.gb", DataSetTypeInfo.SEQ_FILE }, - { "PRS316.fasta", DataSetTypeInfo.SEQ_FILE }, - { "PRS316.xdna", DataSetTypeInfo.SEQ_FILE }, - { "PRS316-1.ab1", DataSetTypeInfo.RAW_DATA }, - { "PRS316-2.ab1", DataSetTypeInfo.RAW_DATA }, - { "PRS316-3.ab1", DataSetTypeInfo.RAW_DATA }, - { "PRS316.png", DataSetTypeInfo.VERIFICATION }, - { "PRS316.tiff", DataSetTypeInfo.VERIFICATION } - - }; - } - - private static Properties prepareProperties(String typeMapping) - { - Properties result = new Properties(); - result.put(DataSetTypeOracle.DATASET_TYPES_NAME, typeMapping); - return result; - } - - @Test(dataProvider = "files") - public void testFile(String filename, DataSetTypeInfo expectedInfo) - { - File file = new File(workingDirectory, filename); - DataSetTypeOracle.initializeMapping(prepareProperties(MAPPING)); - - DataSetTypeInfo info = DataSetTypeOracle.extractDataSetTypeInfo(file); - assertEquals(expectedInfo, info); - assertEquals(info != DataSetTypeInfo.SEQ_FILE, info.isMeasured()); - } - - public void testDirectory() - { - DataSetTypeInfo info = DataSetTypeOracle.extractDataSetTypeInfo(workingDirectory); - assertEquals(DataSetTypeInfo.UNKNOWN, info); - } - -} diff --git a/plasmid/sourceTest/java/tests.xml b/plasmid/sourceTest/java/tests.xml deleted file mode 100644 index dfe66878db83678109743fd86955b9fd851325e5..0000000000000000000000000000000000000000 --- a/plasmid/sourceTest/java/tests.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > - -<suite name="All" verbose="1"> - <test name="All"> - <groups> - <run> - <exclude name="broken" /> - </run> - </groups> - <packages> - <package name="ch.ethz.bsse.cisd.plasmid.dss.*" /> - </packages> - </test> -</suite> diff --git a/rtd_cina/settings.gradle b/rtd_cina/settings.gradle index 733f3175645e7d0db57c08df98e8609ccc1b0c59..8d78fd7573d94892c5703815b71eed16fec19da5 100644 --- a/rtd_cina/settings.gradle +++ b/rtd_cina/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'plasmid', 'openbis_standard_technologies', + 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'openbis_standard_technologies', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' diff --git a/ui-test/settings.gradle b/ui-test/settings.gradle index 4b1ece93db3486a9dd1438328712a221f60c1782..52e5be4efd635debe99b119accf34ddabc9d9b44 100644 --- a/ui-test/settings.gradle +++ b/ui-test/settings.gradle @@ -1,2 +1,2 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'plasmid', 'openbis_standard_technologies' +includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', + 'datastore_server', 'screening', 'rtd_yeastx', 'deep_sequencing_unit', 'openbis_standard_technologies'